Merge "updated architecture file."
diff --git a/build-python.sh b/build-python.sh
index 93c97ff..48725fe 100755
--- a/build-python.sh
+++ b/build-python.sh
@@ -1,16 +1,22 @@
#!/bin/bash
-# Modify any import statements (to remove subdir path)
+# Modifies any import statements (to remove subdir path)
-## Modify import statement in proto/AndroidSystemControlMessage.proto
+## Modifies import statement in proto files.
sed -i 's/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/import "InterfaceSpecificationMessage.proto";/g' proto/AndroidSystemControlMessage.proto
-## Compile proto/AndroidSystemControlMessage.proto to .py code
+sed -i 's/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/import "InterfaceSpecificationMessage.proto";/g' proto/ComponentSpecificationMessage.proto
+
+## Compiles modified proto files to .py files.
protoc -I=proto --python_out=proto proto/AndroidSystemControlMessage.proto
-## Restore import statement in proto/AndroidSystemControlMessage.proto
+protoc -I=proto --python_out=proto proto/ComponentSpecificationMessage.proto
+
+## Restores import statement in proto files.
sed -i 's/import "InterfaceSpecificationMessage.proto";/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/g' proto/AndroidSystemControlMessage.proto
+sed -i 's/import "InterfaceSpecificationMessage.proto";/import "test\/vts\/proto\/InterfaceSpecificationMessage.proto";/g' proto/ComponentSpecificationMessage.proto
protoc -I=proto --python_out=proto proto/InterfaceSpecificationMessage.proto
protoc -I=proto --python_out=proto proto/VtsReportMessage.proto
-# Compile all the python source codes
+# Compiles all the python source codes.
python -m compileall .
+
diff --git a/doc/web/vts_dashboard.md b/doc/web/vts_dashboard.md
index c3b926d..5a13da0 100644
--- a/doc/web/vts_dashboard.md
+++ b/doc/web/vts_dashboard.md
@@ -91,6 +91,9 @@
```
within the 'com.google.appengine' plugin tag :
+ Install the Google App Engine Python SDK:
+ https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python
+
## To run GAE on local machine:
$ cd web/dashboard/appengine/servlet
diff --git a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
index 7276571..a6fe44d 100644
--- a/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
+++ b/harnesses/tradefed/src/com/android/tradefed/testtype/VtsMultiDeviceTestResultParser.java
@@ -219,7 +219,7 @@
markTestFailure();
return true;
} else if (lastToken.equals(SKIP)){
- markTestSkip();
+ // SKIP is not a recognized test type in TradeFed.
return true;
} else {
markTestTimeout();
@@ -344,13 +344,6 @@
mTestResultCache.put(mCurrentTestId, TIMEOUT);
}
- /**
- * This method is called whenever the current test decides to skip the test
- */
- private void markTestSkip() {
- mTestResultCache.put(mCurrentTestId, SKIP);
- }
-
@Override
public boolean isCancelled() {
return false;
diff --git a/proto/ComponentSpecificationMessage.proto b/proto/ComponentSpecificationMessage.proto
new file mode 100644
index 0000000..4ed762c
--- /dev/null
+++ b/proto/ComponentSpecificationMessage.proto
@@ -0,0 +1,52 @@
+// Copyright 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto2";
+
+package android.vts;
+
+import "test/vts/proto/InterfaceSpecificationMessage.proto";
+
+
+// To specify a module (which is logically equivalent to a .hal file in case
+// of a HIDL HAL).
+message ComponentSpecificationMessage {
+ // Class, type, and version of a target component.
+ optional ComponentClass component_class = 1;
+ optional ComponentType component_type = 2;
+ optional float component_type_version = 3 [default = 1.0];
+
+ // The name of a target component (used for HIDL HALs).
+ optional bytes component_name = 4;
+
+ // The package path of a target component (e.g., android.hardware.name).
+ // name implies the component_type field.
+ optional bytes package = 11;
+
+ // The modules to import (e.g., package_path.component_name).
+ repeated bytes import = 12;
+
+ // The name of original C/C++ data structure
+ // (used for conventional and legacy HALs).
+ optional bytes original_data_structure_name = 1001;
+
+ // a list of headers that need to be imported in order to use the component.
+ repeated bytes header = 1002;
+
+ // For a .hal file which actually defines an interface.
+ optional InterfaceSpecificationMessage interface = 2001;
+
+ // For a .hal file which does not defines an interface (e.g., types.hal).
+ repeated VariableSpecificationMessage attributes = 2101;
+}
diff --git a/proto/ComponentSpecificationMessage_pb2.py b/proto/ComponentSpecificationMessage_pb2.py
new file mode 100644
index 0000000..b1ae7b2
--- /dev/null
+++ b/proto/ComponentSpecificationMessage_pb2.py
@@ -0,0 +1,125 @@
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: ComponentSpecificationMessage.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+
+import InterfaceSpecificationMessage_pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+ name='ComponentSpecificationMessage.proto',
+ package='android.vts',
+ serialized_pb='\n#ComponentSpecificationMessage.proto\x12\x0b\x61ndroid.vts\x1a#InterfaceSpecificationMessage.proto\"\x9d\x03\n\x1d\x43omponentSpecificationMessage\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>\n\tinterface\x18\xd1\x0f \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\x12>\n\nattributes\x18\xb5\x10 \x03(\x0b\x32).android.vts.VariableSpecificationMessage')
+
+
+
+
+_COMPONENTSPECIFICATIONMESSAGE = _descriptor.Descriptor(
+ name='ComponentSpecificationMessage',
+ full_name='android.vts.ComponentSpecificationMessage',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='component_class', full_name='android.vts.ComponentSpecificationMessage.component_class', index=0,
+ number=1, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='component_type', full_name='android.vts.ComponentSpecificationMessage.component_type', index=1,
+ number=2, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='component_type_version', full_name='android.vts.ComponentSpecificationMessage.component_type_version', index=2,
+ number=3, type=2, cpp_type=6, label=1,
+ has_default_value=True, default_value=1,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='component_name', full_name='android.vts.ComponentSpecificationMessage.component_name', index=3,
+ number=4, 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='package', full_name='android.vts.ComponentSpecificationMessage.package', index=4,
+ 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),
+ _descriptor.FieldDescriptor(
+ name='import', full_name='android.vts.ComponentSpecificationMessage.import', index=5,
+ number=12, type=12, cpp_type=9, 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='original_data_structure_name', full_name='android.vts.ComponentSpecificationMessage.original_data_structure_name', index=6,
+ number=1001, 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='header', full_name='android.vts.ComponentSpecificationMessage.header', index=7,
+ number=1002, type=12, cpp_type=9, 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='interface', full_name='android.vts.ComponentSpecificationMessage.interface', index=8,
+ number=2001, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='attributes', full_name='android.vts.ComponentSpecificationMessage.attributes', index=9,
+ number=2101, 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),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ extension_ranges=[],
+ serialized_start=90,
+ serialized_end=503,
+)
+
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['component_class'].enum_type = InterfaceSpecificationMessage_pb2._COMPONENTCLASS
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['component_type'].enum_type = InterfaceSpecificationMessage_pb2._COMPONENTTYPE
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['interface'].message_type = InterfaceSpecificationMessage_pb2._INTERFACESPECIFICATIONMESSAGE
+_COMPONENTSPECIFICATIONMESSAGE.fields_by_name['attributes'].message_type = InterfaceSpecificationMessage_pb2._VARIABLESPECIFICATIONMESSAGE
+DESCRIPTOR.message_types_by_name['ComponentSpecificationMessage'] = _COMPONENTSPECIFICATIONMESSAGE
+
+class ComponentSpecificationMessage(_message.Message):
+ __metaclass__ = _reflection.GeneratedProtocolMessageType
+ DESCRIPTOR = _COMPONENTSPECIFICATIONMESSAGE
+
+ # @@protoc_insertion_point(class_scope:android.vts.ComponentSpecificationMessage)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/proto/InterfaceSpecificationMessage.proto b/proto/InterfaceSpecificationMessage.proto
index 794ca63..f3d527a 100644
--- a/proto/InterfaceSpecificationMessage.proto
+++ b/proto/InterfaceSpecificationMessage.proto
@@ -58,6 +58,9 @@
// for bionic's libm
BIONIC_LIBM = 1001;
+
+ // for VNDK's libcutils
+ VNDK_LIBCUTILS = 1101;
}
diff --git a/proto/InterfaceSpecificationMessage_pb2.py b/proto/InterfaceSpecificationMessage_pb2.py
index b524442..7507add 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\"C\n NativeCodeCoverageRawDataMessage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x0c\n\x04gcda\x18\x0b \x01(\x0c\"\xa9\x04\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0esubmodule_name\x18\x02 \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\x12N\n\x1areturn_type_submodule_spec\x18\r \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\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\"\x84\x03\n\x16ScalarDataValueMessage\x12\x0e\n\x06\x62ool_t\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\x16\n\ruchar_pointer\x18\xd5\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*\xf7\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\x12\x12\n\x0eTYPE_SUBMODULE\x10\x0b')
+ 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\x04gcda\x18\x0b \x01(\x0c\"\xa9\x04\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0esubmodule_name\x18\x02 \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\x12N\n\x1areturn_type_submodule_spec\x18\r \x01(\x0b\x32*.android.vts.InterfaceSpecificationMessage\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\"\x84\x03\n\x16ScalarDataValueMessage\x12\x0e\n\x06\x62ool_t\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\x16\n\ruchar_pointer\x18\xd5\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*\xa1\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\x12\x13\n\x0eVNDK_LIBCUTILS\x10\xcd\x08*\xf7\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\x12\x12\n\x0eTYPE_SUBMODULE\x10\x0b')
_COMPONENTCLASS = _descriptor.EnumDescriptor(
name='ComponentClass',
@@ -104,11 +104,15 @@
name='BIONIC_LIBM', index=9, number=1001,
options=None,
type=None),
+ _descriptor.EnumValueDescriptor(
+ name='VNDK_LIBCUTILS', index=10, number=1101,
+ options=None,
+ type=None),
],
containing_type=None,
options=None,
serialized_start=3345,
- serialized_end=3485,
+ serialized_end=3506,
)
ComponentType = enum_type_wrapper.EnumTypeWrapper(_COMPONENTTYPE)
@@ -169,8 +173,8 @@
],
containing_type=None,
options=None,
- serialized_start=3488,
- serialized_end=3735,
+ serialized_start=3509,
+ serialized_end=3756,
)
VariableType = enum_type_wrapper.EnumTypeWrapper(_VARIABLETYPE)
@@ -191,6 +195,7 @@
BLUETOOTH = 7
NFC = 8
BIONIC_LIBM = 1001
+VNDK_LIBCUTILS = 1101
UNKNOWN_VARIABLE_TYPE = 0
TYPE_PREDEFINED = 1
TYPE_SCALAR = 2
diff --git a/setup.sh b/setup.sh
index 7c6ec8a..7e40aa9 100755
--- a/setup.sh
+++ b/setup.sh
@@ -57,6 +57,7 @@
adb push specification/hal_hidl/Nfc.vts /data/local/tmp/spec/Nfc.vts
adb push specification/hal_hidl/NfcClientCallback.vts /data/local/tmp/spec/NfcClientCallback.vts
adb push specification/lib_bionic/libmV1.vts /data/local/tmp/spec/libmV1.vts
+ adb push specification/lib_bionic/libcutilsV1.vts /data/local/tmp/spec/libcutilsV1.vts
echo "install asan packages"
# asan
diff --git a/specification/Android.mk b/specification/Android.mk
index 32f9fd6..918cd2d 100644
--- a/specification/Android.mk
+++ b/specification/Android.mk
@@ -26,6 +26,7 @@
hal_conventional/BluetoothHalV1.vts \
hal_conventional/BluetoothHalV1bt_interface_t.vts \
lib_bionic/libmV1.vts \
+ lib_bionic/libcutilsV1.vts \
VTS_ENABLE_TREBLE:=
@@ -123,8 +124,9 @@
vts_spec_file6 := $(VTS_TESTCASES_OUT)/WifiHalV1.vts
vts_spec_file7 := $(VTS_TESTCASES_OUT)/Nfc.vts
vts_spec_file8 := $(VTS_TESTCASES_OUT)/NfcClientCallback.vts
-+vts_spec_file9 := $(VTS_TESTCASES_OUT)/BluetoothHalV1.vts
-+vts_spec_file10 := $(VTS_TESTCASES_OUT)/BluetoothHalV1bt_interface_t.vts
+vts_spec_file9 := $(VTS_TESTCASES_OUT)/BluetoothHalV1.vts
+vts_spec_file10 := $(VTS_TESTCASES_OUT)/BluetoothHalV1bt_interface_t.vts
+vts_spec_file11 := $(VTS_TESTCASES_OUT)/libcutilsV1.vts
$(vts_spec_file1): $(LOCAL_PATH)/hal_conventional/CameraHalV2.vts | $(ACP)
$(hide) mkdir -p $(VTS_TESTCASES_OUT)
@@ -166,6 +168,10 @@
$(hide) mkdir -p $(VTS_TESTCASES_OUT)
$(hide) $(ACP) -fp $< $@
-vts: $(vts_spec_file1) $(vts_spec_file2) $(vts_spec_file3) $(vts_spec_file4) $(vts_spec_file5) $(vts_spec_file6) $(vts_spec_file7) $(vts_spec_file8) $(vts_spec_file9) $(vts_spec_file10)
+$(vts_spec_file11): $(LOCAL_PATH)/lib_bionic/libcutilsV1.vts | $(ACP)
+ $(hide) mkdir -p $(VTS_TESTCASES_OUT)
+ $(hide) $(ACP) -fp $< $@
+
+vts: $(vts_spec_file1) $(vts_spec_file2) $(vts_spec_file3) $(vts_spec_file4) $(vts_spec_file5) $(vts_spec_file6) $(vts_spec_file7) $(vts_spec_file8) $(vts_spec_file9) $(vts_spec_file10) $(vts_spec_file11)
diff --git a/specification/lib_bionic/libcutilsV1.vts b/specification/lib_bionic/libcutilsV1.vts
new file mode 100644
index 0000000..66554ea
--- /dev/null
+++ b/specification/lib_bionic/libcutilsV1.vts
@@ -0,0 +1,88 @@
+component_class: LIB_SHARED
+component_type: VNDK_LIBCUTILS
+component_type_version: 1.0
+component_name: "libcutils"
+
+header: "<unistd.h>"
+header: "<stdint.h>"
+header: "<sys/types.h>"
+
+api: {
+ name: "qtaguid_tagSocket"
+ return_type: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "uint32_t"
+ }
+
+}
+
+api: {
+ name: "qtaguid_untagSocket"
+ return_type: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+
+}
+
+api: {
+ name: "qtaguid_setCounterSet"
+ return_type: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "uint32_t"
+ }
+
+}
+api: {
+ name: "qtaguid_deleteTagData"
+ return_type: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "uint32_t"
+ }
+
+}
+
+api: {
+ name: "qtaguid_setPacifier"
+ return_type: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+ arg: {
+ type: TYPE_SCALAR
+ scalar_type: "int32_t"
+ }
+}
+
diff --git a/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp b/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp
index 01721b0..b8a5a7b 100644
--- a/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp
+++ b/sysfuzzer/vtscompiler/code_gen/LibSharedCodeGen.cpp
@@ -59,6 +59,11 @@
message.original_data_structure_name().length() > 0) {
cpp_ss << "reinterpret_cast<" << GetCppVariableType(arg) << ">("
<< kInstanceVariableName << ")";
+ } else if (arg.type() == TYPE_SCALAR) {
+ cpp_ss << "(func_msg->arg(" << arg_count << ").type() == TYPE_SCALAR && "
+ << "func_msg->arg(" << arg_count << ").scalar_value().has_" << arg.scalar_type() << "()) ? "
+ << "func_msg->arg(" << arg_count << ").scalar_value()." << arg.scalar_type() << "()"
+ << " : " << GetCppInstanceType(arg);
} else {
cpp_ss << GetCppInstanceType(arg);
}
diff --git a/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py b/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py
index 28e6ed8..a858d70 100644
--- a/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py
+++ b/testcases/host/shell_binary_crash_test/ShellBinaryCrashTest.py
@@ -27,6 +27,9 @@
class ShellBinaryCrashTest(base_test_with_webdb.BaseTestWithWebDbClass):
"""A binary crash test case for the shell driver."""
+ EXIT_CODE_CRASH = 133
+ EXIT_CODE_SEGFAULT = 139
+
def setUpClass(self):
self.dut = self.registerController(android_device)[0]
@@ -35,13 +38,12 @@
self.dut.shell.InvokeTerminal("my_shell1")
target = "/data/local/tmp/64/vts_test_binary_crash_app"
results = self.dut.shell.my_shell1.Execute(
- ["chmod 755 %s" % target,
- "%s" % target])
+ ["chmod 755 %s" % target, target])
logging.info(str(results[const.STDOUT]))
asserts.assertEqual(len(results[const.STDOUT]), 2)
asserts.assertEqual(results[const.STDOUT][1].strip(), "")
# "crash_app: start" is also valid output.
- asserts.assertEqual(results[const.EXIT_CODE][1], 127)
+ asserts.assertEqual(results[const.EXIT_CODE][1], self.EXIT_CODE_CRASH)
self.CheckShellDriver("my_shell1")
self.CheckShellDriver("my_shell2")
@@ -51,14 +53,14 @@
self.dut.shell.InvokeTerminal("my_shell1")
target = "/data/local/tmp/32/connect01"
results = self.dut.shell.my_shell1.Execute(
- ["chmod 755 %s" % target,
- "%s" % target])
+ ["chmod 755 %s" % target, target])
logging.info(str(results[const.STDOUT]))
asserts.assertEqual(len(results[const.STDOUT]), 2)
asserts.assertEqual(results[const.STDOUT][1].strip(), "")
# TODO: currently the agent doesn't return the stdout log emitted
# before a failure.
- asserts.assertEqual(results[const.EXIT_CODE][1], 127)
+ asserts.assertEqual(results[const.EXIT_CODE][1],
+ self.EXIT_CODE_SEGFAULT)
self.CheckShellDriver("my_shell1")
self.CheckShellDriver("my_shell2")
diff --git a/testcases/kernel/ltp/Android.mk b/testcases/kernel/ltp/Android.mk
index 36c142a..f9e3276 100644
--- a/testcases/kernel/ltp/Android.mk
+++ b/testcases/kernel/ltp/Android.mk
@@ -1,18 +1,19 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := KernelLtpTest
-LOCAL_MODULE_CLASS := FAKE
-LOCAL_IS_HOST_MODULE := true
-LOCAL_COMPATIBILITY_SUITE := vts
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE):
- @echo "VTS host-driven test target: $(LOCAL_MODULE)"
- $(hide) touch $@
-
-VTS_CONFIG_SRC_DIR := testcases/kernel/ltp
-include test/vts/tools/build/Android.host_config.mk
-
+include $(call all-subdir-makefiles)
diff --git a/testcases/kernel/ltp/KernelLtpTest.py b/testcases/kernel/ltp/KernelLtpTest.py
index 47dfb52..58298c7 100644
--- a/testcases/kernel/ltp/KernelLtpTest.py
+++ b/testcases/kernel/ltp/KernelLtpTest.py
@@ -16,7 +16,6 @@
#
import logging
-import os
from vts.runners.host import asserts
from vts.runners.host import base_test_with_webdb
@@ -25,57 +24,50 @@
from vts.runners.host import test_runner
from vts.utils.python.controllers import android_device
-from vts.testcases.kernel.ltp import KernelLtpTestHelper
+from vts.testcases.kernel.ltp import test_cases_parser
+from vts.testcases.kernel.ltp import environment_requirement_checker as env_checker
+from vts.testcases.kernel.ltp import ltp_enums
+from vts.testcases.kernel.ltp import ltp_configs
class KernelLtpTest(base_test_with_webdb.BaseTestWithWebDbClass):
"""Runs the LTP (Linux Test Project) testcases against Android OS kernel.
Attributes:
- _TPASS: int, exit_code for Test pass
- _TCONF: int, The test case is not for current configuration of kernel
- _32BIT: int, for 32 bit tests
- _64BIT: int, for 64 bit tests
_dut: AndroidDevice, the device under test
_shell: ShellMirrorObject, shell mirror object used to execute commands
- _ltp_dir: string, ltp build root directory on target
_testcases: TestcasesParser, test case input parser
_env: dict<stirng, stirng>, dict of environment variable key value pair
- _KEY_ENV__: constant strings starting with prefix "_KEY_ENV_" are used as dict
- key in environment variable dictionary
"""
- _TPASS = 0
- _TCONF = 32
- _32BIT = 32
- _64BIT = 64
- _KEY_ENV_TMPDIR = 'TMPDIR'
- _KEY_ENV_TMP = 'TMP'
- _KEY_ENV_LTP_DEV_FS_TYPE = 'LTP_DEV_FS_TYPE'
- _KEY_ENV_LTPROOT = 'LTPROOT'
- _KEY_ENV_PATH = 'PATH'
+ _32BIT = "32"
+ _64BIT = "64"
def setUpClass(self):
"""Creates a remote shell instance, and copies data files."""
- required_params = [keys.ConfigKeys.IKEY_DATA_FILE_PATH]
+ required_params = [keys.ConfigKeys.IKEY_DATA_FILE_PATH,
+ ltp_enums.ConfigKeys.RUN_STAGING]
self.getUserParams(required_params)
logging.info("data_file_path: %s", self.data_file_path)
+ logging.info("run_staging: %s", self.run_staging)
+
self._dut = self.registerController(android_device)[0]
self._dut.shell.InvokeTerminal("one")
self._shell = self._dut.shell.one
- self._ltp_dir = "/data/local/tmp/ltp"
- self._requirement = KernelLtpTestHelper.EnvironmentRequirementChecker(
+ self._requirement = env_checker.EnvironmentRequirementChecker(
self._shell)
- self._testcases = KernelLtpTestHelper.TestCasesParser(
+ self._testcases = test_cases_parser.TestCasesParser(
self.data_file_path)
- self._env = {self._KEY_ENV_TMPDIR: KernelLtpTestHelper.LTPTMP,
- self._KEY_ENV_TMP: "%s/tmp" % KernelLtpTestHelper.LTPTMP,
- self._KEY_ENV_LTP_DEV_FS_TYPE: "ext4",
- self._KEY_ENV_LTPROOT: self._ltp_dir,
- self._KEY_ENV_PATH:
- "/system/bin:%s/testcases/bin" % self._ltp_dir, }
+ self._env = {ltp_enums.ShellEnvKeys.TMP: ltp_configs.TMP,
+ ltp_enums.ShellEnvKeys.TMPBASE: ltp_configs.TMPBASE,
+ ltp_enums.ShellEnvKeys.LTPTMP: ltp_configs.LTPTMP,
+ ltp_enums.ShellEnvKeys.TMPDIR: ltp_configs.TMPDIR,
+ ltp_enums.ShellEnvKeys.LTP_DEV_FS_TYPE:
+ ltp_configs.LTP_DEV_FS_TYPE,
+ ltp_enums.ShellEnvKeys.LTPROOT: ltp_configs.LTPDIR,
+ ltp_enums.ShellEnvKeys.PATH: ltp_configs.PATH}
def PushFiles(self, n_bit):
"""Push the related files to target.
@@ -85,10 +77,9 @@
_64BIT, or 64, for 64bit test;
"""
- self._shell.Execute("mkdir %s -p" % self._ltp_dir)
- self._dut.adb.push("%s/%i/ltp/. %s" %
- (self.data_file_path, n_bit, self._ltp_dir))
- # TODO: libcap
+ self._shell.Execute("mkdir %s -p" % ltp_configs.LTPDIR)
+ self._dut.adb.push("%s/%s/ltp/. %s" %
+ (self.data_file_path, n_bit, ltp_configs.LTPDIR))
def GetEnvp(self):
"""Generate the environment variable required to run the tests."""
@@ -97,13 +88,13 @@
def tearDownClass(self):
"""Deletes all copied data files."""
- self._shell.Execute("rm -rf %s" % self._ltp_dir)
+ self._shell.Execute("rm -rf %s" % ltp_configs.LTPDIR)
self._requirement.Cleanup()
def Verify(self, results):
"""Verifies the test result of each test case."""
- asserts.assertFalse(len(results) == 0,
- "No response received. Socket timeout")
+ asserts.assertFalse(
+ len(results) == 0, "No response received. Socket timeout")
logging.info("stdout: %s", results[const.STDOUT])
logging.info("stderr: %s", results[const.STDERR])
@@ -114,12 +105,13 @@
stdout = results[const.STDOUT][0]
ret_code = results[const.EXIT_CODE][0]
# Test case is not for the current configuration, SKIP
- if ret_code == self._TCONF:
+ if ret_code == ltp_enums.TestExitCode.TCONF:
asserts.skipIf('TPASS' not in stdout,
"Incompatible test skipped: TCONF")
else:
- asserts.assertEqual(ret_code, self._TPASS,
- "Got return code %s, test did not pass." % ret_code)
+ asserts.assertEqual(ret_code, ltp_enums.TestExitCode.TPASS,
+ "Got return code %s, test did not pass." %
+ ret_code)
def TestNBits(self, n_bit):
"""Runs all 32-bit or 64-bit LTP test cases.
@@ -129,19 +121,22 @@
_64BIT, or 64, for 64bit test;
"""
self.PushFiles(n_bit)
- logging.info("[Test Case] test%iBits SKIP", n_bit)
+ logging.info("[Test Case] test%sBits SKIP", n_bit)
- test_cases = list(self._testcases.Load(self._ltp_dir))
+ test_cases = list(
+ self._testcases.Load(
+ ltp_configs.LTPDIR, n_bit=n_bit, run_staging=self.run_staging))
logging.info("Checking binary exists for all test cases.")
self._requirement.RunCheckTestcasePathExistsAll(test_cases)
self._requirement.RunChmodTestcasesAll(test_cases)
- logging.info("Start running individual tests.")
+ logging.info("Start running %i individual tests." % len(test_cases))
- self.runGeneratedTests(test_func=self.RunLtpOnce,
- settings=test_cases,
- args=(n_bit, ),
- name_func=self.GetTestName)
- logging.info("[Test Case] test%iBits", n_bit)
+ self.runGeneratedTests(
+ test_func=self.RunLtpOnce,
+ settings=test_cases,
+ args=(n_bit, ),
+ name_func=self.GetTestName)
+ logging.info("[Test Case] test%sBits", n_bit)
asserts.skip("Finished generating {} bit tests.".format(n_bit))
def GetTestName(self, test_case, n_bit):
@@ -155,7 +150,7 @@
cmd = "env {envp} {binary} {args}".format(
envp=self.GetEnvp(),
binary=test_case.path,
- args=test_case.GetArgs("$LTPROOT", self._ltp_dir))
+ args=test_case.GetArgs("$LTPROOT", ltp_configs.LTPDIR))
logging.info("Executing %s", cmd)
self.Verify(self._shell.Execute(cmd))
diff --git a/testcases/kernel/ltp/KernelLtpTestHelper.py b/testcases/kernel/ltp/KernelLtpTestHelper.py
deleted file mode 100644
index 2b46f4c..0000000
--- a/testcases/kernel/ltp/KernelLtpTestHelper.py
+++ /dev/null
@@ -1,356 +0,0 @@
-#!/usr/bin/env python3.4
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-import copy
-import logging
-import os
-
-from vts.runners.host import asserts
-from vts.runners.host import const
-from vts.testcases.kernel.ltp.shell_environment import ShellEnvironment
-from vts.testcases.kernel.ltp.shell_environment import CheckDefinition
-
-LTPTMP = "/data/local/tmp/ltp/temp"
-
-REQUIREMENTS_TO_TESTCASE = {"loop_device_support": ["syscalls-mount01",
- "syscalls-fchmod06",
- "syscalls-ftruncate04",
- "syscalls-ftruncate04_64",
- "syscalls-inotify03",
- "syscalls-link08",
- "syscalls-linkat02",
- "syscalls-mkdir03",
- "syscalls-mkdirat02",
- "syscalls-mknod07",
- "syscalls-mknodat02",
- "syscalls-mmap16",
- "syscalls-mount01",
- "syscalls-mount02",
- "syscalls-mount03",
- "syscalls-mount04",
- "syscalls-mount06",
- "syscalls-rename11",
- "syscalls-renameat01",
- "syscalls-rmdir02",
- "syscalls-umount01",
- "syscalls-umount02",
- "syscalls-umount03",
- "syscalls-umount2_01",
- "syscalls-umount2_02",
- "syscalls-umount2_03",
- "syscalls-utime06",
- "syscalls-utimes01",
- "syscalls-mkfs01", ]}
-
-REQUIREMENT_FOR_ALL = ["ltptmp_dir"]
-
-REQUIREMENT_TO_TESTSUITE = {}
-
-
-class RequirementState(object):
- """Enum for test case requirement check state
-
- Attributes:
- UNCHECKED: test case requirement has not been checked
- PATHEXISTS: the path of the test case has been verified exist, but
- all the other requirements have not been checked
- SATISFIED: all the requirements are satisfied
- UNSATISFIED: some of the requirements are not satisfied. Test case will
- not be executed
- """
- UNCHECKED = 0
- PATHEXISTS = 1
- SATISFIED = 2
- UNSATISFIED = 3
-
-
-class TestCase(object):
- """Stores name, path, and param information for each test case.
-
- Attributes:
- testsuite: string, name of testsuite to which the testcase belongs
- testname: string, name of the test case
- path: string, test binary path
- _args: list of string, test case command line arguments
- requirement_state: RequirementState, enum representing requirement
- check results
- note: string, a place to store additional note for the test case
- such as what environment requirement did not satisfy.
- """
-
- def __init__(self, testsuite, testname, path, args):
- self.testsuite = testsuite
- self.testname = testname
- self.path = path
- self._args = args
- self.requirement_state = RequirementState.UNCHECKED
- self.note = None
-
- @property
- def note(self):
- """Get the note"""
- return self._note
-
- @note.setter
- def note(self, note):
- """Set the note"""
- self._note = note
-
- @property
- def requirement_state(self):
- """Get the requirement state"""
- return self._requirement_state
-
- @requirement_state.setter
- def requirement_state(self, requirement_state):
- """Set the requirement state"""
- self._requirement_state = requirement_state
-
- @property
- def testsuite(self):
- """Get the test suite's name."""
- return self._testsuite
-
- @testsuite.setter
- def testsuite(self, testsuite):
- """Set the test suite's name."""
- self._testsuite = testsuite
-
- @property
- def testname(self):
- """Get the test case's name."""
- return self._testname
-
- @testname.setter
- def testname(self, testname):
- """Set the test case's name."""
- self._testname = testname
-
- @property
- def path(self):
- """Get the test binary's file name."""
- return self._path
-
- @path.setter
- def path(self, path):
- """Set the test testbinary's name."""
- self._path = path
-
- def GetArgs(self, replace_string_from=None, replace_string_to=None):
- """Get the case arguments in string format.
-
- if replacement string is provided, arguments will be
- filtered with the replacement string
-
- Args:
- replace_string_from: string, replacement string source, if any
- replace_string_to: string, replacement string destination, if any
-
- Returns:
- string, arguments formated in space separated string
- """
- if replace_string_from is None or replace_string_to is None:
- return ' '.join(self._args)
- else:
- return ' '.join([p.replace(replace_string_from, replace_string_to)
- for p in self._args])
-
- def __str__(self):
- return "%s-%s" % (self.testsuite, self.testname)
-
-
-class TestCasesParser(object):
- """Load a ltp vts testcase definition file and parse it into a generator.
-
- Attributes:
- _data_path: string, the vts data path on host side
- """
-
- def __init__(self, data_path):
- self._data_path = data_path
-
- def _GetTestcaseFilePath(self):
- """return the test case definition fiile's path."""
- return os.path.join(self._data_path, '32', 'ltp',
- 'ltp_vts_testcases.txt')
-
- def Load(self, ltp_dir):
- """read the definition file and return a TestCase generator."""
- with open(self._GetTestcaseFilePath(), 'r') as f:
- for line in f:
- items = line.split('\t')
- if not len(items) == 4:
- continue
- testsuite, testname, testbinary, arg = items
- arg = arg.strip()
-
- if testname.startswith("DISABLED_"):
- continue
-
- args = []
- if arg:
- args.extend(arg.split(','))
- yield TestCase(
- testsuite, testname,
- os.path.join(ltp_dir, 'testcases/bin', testbinary), args)
-
-
-class EnvironmentRequirementChecker(object):
- """LTP testcase environment checker.
-
- This class contains a dictionary for some known environment
- requirements for a set of test cases and several environment
- check functions to be mapped with. All check functions' results
- are cached in a dictionary for multiple use.
-
- Attributes:
- _REQUIREMENT_DEFINITIONS: dictionary {string, method}, a map between requirement
- name and the actual check method inside class
- _result_cache: dictionary {requirement_check_method_name: (bool, string)}
- a map between check method name and cached result
- tuples (boolean, note)
- _shell_env: ShellEnvironment object, which checks and sets shell environments
- given a shell mirror
- shell: shell mirror object, can be used to execute shell commands on target
- side through runner
- """
-
- def __init__(self, shell):
- self.shell = shell
- self._result_cache = {}
-
- self._shell_env = ShellEnvironment(self.shell)
- loop_device_support = CheckDefinition(self._shell_env.LoopDeviceSupport)
- ltptmp_dir = CheckDefinition(self._shell_env.DirsAllExistAndPermission,
- True, True, [LTPTMP, "%s/tmp" % LTPTMP],
- [775, 775])
- self._REQUIREMENT_DEFINITIONS = {
- "loop_device_support": loop_device_support,
- "ltptmp_dir": ltptmp_dir
- }
-
- @property
- def shell(self):
- """Get the runner's shell mirror object to execute commands"""
- return self._shell
-
- @shell.setter
- def shell(self, shell):
- """Set the runner's shell mirror object to execute commands"""
- self._shell = shell
-
- def Cleanup(self):
- """Run all cleanup jobs at the end of tests"""
- self._shell_env.Cleanup()
-
- def GetRequirements(self, test_case):
- """Get a list of requirements for a fiven test case
-
- Args:
- test_case: TestCase object, the test case to query
- """
- result = copy.copy(REQUIREMENT_FOR_ALL)
-
- for rule in REQUIREMENTS_TO_TESTCASE:
- if str(test_case) in REQUIREMENTS_TO_TESTCASE[rule]:
- result.append(rule)
-
- for rule in REQUIREMENT_TO_TESTSUITE:
- if test_case.testsuite in REQUIREMENT_TO_TESTSUITE[rule]:
- result.append(rule)
-
- return list(set(result))
-
- def Check(self, test_case):
- """Check whether a given test case's requirement has been satisfied.
- Skip the test if not.
-
- Args:
- test_case: TestCase object, a given test case to check
- """
- asserts.skipIf(
- test_case.requirement_state == RequirementState.UNSATISFIED,
- test_case.note)
- asserts.skipIf(not self.IsTestBinaryExist(test_case),
- test_case.note)
-
- for requirement_name in self.GetRequirements(test_case):
- if requirement_name not in self._result_cache:
- req_def = self._REQUIREMENT_DEFINITIONS[requirement_name]
- self._result_cache[requirement_name] = req_def.Execute()
- result, note = self._result_cache[requirement_name]
- logging.info("Result for %s's requirement %s is %s", test_case,
- requirement_name, result)
- if result is False:
- test_case.requirement_state = RequirementState.UNSATISFIED
- test_case.note = note
- asserts.skip(note)
- test_case.requirement_state = RequirementState.SATISFIED
-
- def RunCheckTestcasePathExistsAll(self, test_cases):
- """Run a batch job to check the path existance of all given test cases
-
- Args:
- test_case: list of TestCase objects.
- """
- commands = ["ls %s" % test_case.path for test_case in test_cases]
- command_results = self._shell.Execute(commands)
- exists_results = [exit_code is 0
- for exit_code in command_results[const.EXIT_CODE]]
- for testcase_result in zip(test_cases, exists_results):
- self.SetCheckResultPathExists(*testcase_result)
-
- def RunChmodTestcasesAll(self, test_cases):
- """Batch commands to make all test case binaries executable
- Test cases whose binary path does not exist will be excluded.
-
- Args:
- test_case: list of TestCase objects.
- """
- self._shell.Execute(["chmod 775 %s" % test_case.path
- for test_case in test_cases
- if self.IsTestBinaryExist(test_case)])
-
- def SetCheckResultPathExists(self, test_case, is_exists):
- """Set a path exists result to a test case object
-
- Args:
- test_case: TestCase object, the target test case
- is_exists: bool, the result. True for exists, False otherwise.
- """
- if is_exists:
- test_case.requirement_state = RequirementState.PATHEXISTS
- else:
- test_case.requirement_state = RequirementState.UNSATISFIED
- test_case.note = "Test binary is not compiled."
-
- def IsTestBinaryExist(self, test_case):
- """Check whether the given test case's binary exists.
-
- Args:
- test_case: TestCase, the object representing the test case
- Return:
- True if exists, False otherwise
- """
- if test_case.requirement_state != RequirementState.UNCHECKED:
- return test_case.requirement_state != RequirementState.UNSATISFIED
-
- command_results = self._shell.Execute("ls %s" % test_case.path)
- exists = command_results[const.STDOUT][0].find(
- ": No such file or directory") > 0
- self.SetCheckResultPathExists(test_case, exists)
- return exists
diff --git a/testcases/kernel/ltp/environment_requirement_checker.py b/testcases/kernel/ltp/environment_requirement_checker.py
new file mode 100644
index 0000000..fd270aa
--- /dev/null
+++ b/testcases/kernel/ltp/environment_requirement_checker.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import copy
+import logging
+
+from vts.runners.host import asserts
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment import shell_environment
+from vts.testcases.kernel.ltp import ltp_enums
+from vts.testcases.kernel.ltp import ltp_configs
+from vts.testcases.kernel.ltp import requirements
+
+
+class EnvironmentRequirementChecker(object):
+ """LTP testcase environment checker.
+
+ This class contains a dictionary for some known environment
+ requirements for a set of test cases and several environment
+ check functions to be mapped with. All check functions' results
+ are cached in a dictionary for multiple use.
+
+ Attributes:
+ _REQUIREMENT_DEFINITIONS: dictionary {string, obj}, a map between
+ requirement name and the actual definition class object
+ _result_cache: dictionary {requirement_check_method_name:
+ (bool, string)}, a map between check method name and cached result
+ tuples (boolean, note)
+ _shell_env: ShellEnvironment object, which checks and sets
+ shell environments given a shell mirror
+ shell: shell mirror object, can be used to execute shell
+ commands on target side through runner
+ """
+
+ def __init__(self, shell):
+ self.shell = shell
+ self._result_cache = {}
+ self._shell_env = shell_environment.ShellEnvironment(self.shell)
+ self._REQUIREMENT_DEFINITIONS = requirements.GetRequrementDefinitions()
+
+ @property
+ def shell(self):
+ """Get the runner's shell mirror object to execute commands"""
+ return self._shell
+
+ @shell.setter
+ def shell(self, shell):
+ """Set the runner's shell mirror object to execute commands"""
+ self._shell = shell
+
+ def Cleanup(self):
+ """Run all cleanup jobs at the end of tests"""
+ self._shell_env.Cleanup()
+
+ def GetRequirements(self, test_case):
+ """Get a list of requirements for a fiven test case
+
+ Args:
+ test_case: TestCase object, the test case to query
+ """
+ result = copy.copy(ltp_configs.REQUIREMENT_FOR_ALL)
+
+ for rule in ltp_configs.REQUIREMENTS_TO_TESTCASE:
+ if str(test_case) in ltp_configs.REQUIREMENTS_TO_TESTCASE[rule]:
+ result.append(rule)
+
+ for rule in ltp_configs.REQUIREMENT_TO_TESTSUITE:
+ if test_case.testsuite in ltp_configs.REQUIREMENT_TO_TESTSUITE[
+ rule]:
+ result.append(rule)
+
+ return list(set(result))
+
+ def Check(self, test_case):
+ """Check whether a given test case's requirement has been satisfied.
+ Skip the test if not.
+
+ Args:
+ test_case: TestCase object, a given test case to check
+ """
+ asserts.skipIf(test_case.requirement_state ==
+ ltp_enums.RequirementState.UNSATISFIED, test_case.note)
+ asserts.skipIf(not self.IsTestBinaryExist(test_case), test_case.note)
+
+ for requirement in self.GetRequirements(test_case):
+ if requirement not in self._result_cache:
+ definitions = self._REQUIREMENT_DEFINITIONS[requirement]
+ self._result_cache[
+ requirement] = self._shell_env.ExecuteDefinitions(
+ definitions)
+
+ result, note = self._result_cache[requirement]
+ logging.info("Result for %s's requirement %s is %s", test_case,
+ requirement, result)
+ if result is False:
+ test_case.requirement_state = ltp_enums.RequirementState.UNSATISFIED
+ test_case.note = note
+ asserts.skip(note)
+ test_case.requirement_state = ltp_enums.RequirementState.SATISFIED
+
+ def RunCheckTestcasePathExistsAll(self, test_cases):
+ """Run a batch job to check the path existance of all given test cases
+
+ Args:
+ test_case: list of TestCase objects.
+ """
+ commands = ["ls %s" % test_case.path for test_case in test_cases]
+ command_results = self._shell.Execute(commands)
+ exists_results = [exit_code is 0
+ for exit_code in command_results[const.EXIT_CODE]]
+ for testcase_result in zip(test_cases, exists_results):
+ self.SetCheckResultPathExists(*testcase_result)
+
+ def RunChmodTestcasesAll(self, test_cases):
+ """Batch commands to make all test case binaries executable
+ Test cases whose binary path does not exist will be excluded.
+
+ Args:
+ test_case: list of TestCase objects.
+ """
+ self._shell.Execute(["chmod 775 %s" % test_case.path
+ for test_case in test_cases
+ if self.IsTestBinaryExist(test_case)])
+
+ def SetCheckResultPathExists(self, test_case, is_exists):
+ """Set a path exists result to a test case object
+
+ Args:
+ test_case: TestCase object, the target test case
+ is_exists: bool, the result. True for exists, False otherwise.
+ """
+ if is_exists:
+ test_case.requirement_state = ltp_enums.RequirementState.PATHEXISTS
+ else:
+ test_case.requirement_state = ltp_enums.RequirementState.UNSATISFIED
+ test_case.note = "Test binary is not compiled."
+
+ def IsTestBinaryExist(self, test_case):
+ """Check whether the given test case's binary exists.
+
+ Args:
+ test_case: TestCase, the object representing the test case
+
+ Return:
+ True if exists, False otherwise
+ """
+ if test_case.requirement_state != ltp_enums.RequirementState.UNCHECKED:
+ return test_case.requirement_state != ltp_enums.RequirementState.UNSATISFIED
+
+ command_results = self._shell.Execute("ls %s" % test_case.path)
+ exists = command_results[const.STDOUT][0].find(
+ ": No such file or directory") > 0
+ self.SetCheckResultPathExists(test_case, exists)
+ return exists
diff --git a/testcases/kernel/ltp/ltp_configs.py b/testcases/kernel/ltp/ltp_configs.py
new file mode 100644
index 0000000..1eff6dc
--- /dev/null
+++ b/testcases/kernel/ltp/ltp_configs.py
@@ -0,0 +1,474 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os
+
+from vts.testcases.kernel.ltp import ltp_enums
+
+# Environment paths for ltp test cases
+# string, ltp build root directory on target
+LTPDIR = "/data/local/tmp/ltp"
+# Directory for environment variable 'TMP' needed by some test cases
+TMP = os.path.join(LTPDIR, "tmp")
+# Directory for environment variable 'TMPBASE' needed by some test cases
+TMPBASE = os.path.join(TMP, "tmpbase")
+# Directory for environment variable 'LTPTMP' needed by some test cases
+LTPTMP = os.path.join(TMP, "ltptemp")
+# Directory for environment variable 'TMPDIR' needed by some test cases
+TMPDIR = os.path.join(TMP, "tmpdir")
+# Add LTP's binary path to PATH
+PATH = "/system/bin:%s" % os.path.join(LTPDIR, "testcases/bin")
+
+# File system type for loop device
+LTP_DEV_FS_TYPE = "ext4"
+
+# Requirement to testcase dictionary.
+REQUIREMENTS_TO_TESTCASE = {
+ ltp_enums.Requirements.LOOP_DEVICE_SUPPORT: [
+ "syscalls-mount01",
+ "syscalls-fchmod06",
+ "syscalls-ftruncate04",
+ "syscalls-ftruncate04_64",
+ "syscalls-inotify03",
+ "syscalls-link08",
+ "syscalls-linkat02",
+ "syscalls-mkdir03",
+ "syscalls-mkdirat02",
+ "syscalls-mknod07",
+ "syscalls-mknodat02",
+ "syscalls-mmap16",
+ "syscalls-mount01",
+ "syscalls-mount02",
+ "syscalls-mount03",
+ "syscalls-mount04",
+ "syscalls-mount06",
+ "syscalls-rename11",
+ "syscalls-renameat01",
+ "syscalls-rmdir02",
+ "syscalls-umount01",
+ "syscalls-umount02",
+ "syscalls-umount03",
+ "syscalls-umount2_01",
+ "syscalls-umount2_02",
+ "syscalls-umount2_03",
+ "syscalls-utime06",
+ "syscalls-utimes01",
+ "syscalls-mkfs01",
+ ],
+}
+
+# Requirement for all test cases
+REQUIREMENT_FOR_ALL = [ltp_enums.Requirements.LTP_TMP_DIR]
+
+# Requirement to test suite dictionary
+REQUIREMENT_TO_TESTSUITE = {}
+
+# Staging tests are temporally disabled in stable version and are being addressed.
+STAGING_TESTS = [
+ # Bug#30675453
+ "syscalls-perf_event_open02_32bit",
+ # Bug#30688551
+ "syscalls-lstat03_64_32bit",
+ "syscalls-lstat03_32bit"
+ # Bug#30688061
+ "input-input03_32bit",
+ # Bug#30688056
+ "cpuhotplug-cpuhotplug04_32bit",
+ # Bug#30699880
+ "mm-mtest01w_32bit",
+ "mm-mtest01_32bit",
+ # Bug#30688574
+ "syscalls-accept4_01_32bit",
+ # Bug#30689411
+ "mm-mmapstress03_32bit"
+]
+
+# Tests disabled
+# Based on external/ltp commit 5f01077afe994f4107b147222f3956716d4a8fde
+DISABLED_TESTS = [
+ "inotify06",
+ "kmsg01",
+ "abort01",
+ "access01",
+ "add_key01",
+ "add_key02",
+ "chdir03",
+ "chmod05",
+ "chmod07",
+ "chown01_16",
+ "chown02_16",
+ "chown03_16",
+ "chown05_16",
+ "chroot01",
+ "creat01",
+ "creat03",
+ "creat04",
+ "creat05",
+ "creat07",
+ "epoll_create1_01",
+ "epoll_ctl01",
+ "epoll_ctl02",
+ "posix_fadvise01",
+ "posix_fadvise01_64",
+ "posix_fadvise03",
+ "posix_fadvise03_64",
+ "fchmod01",
+ "fchmod02",
+ "fchmod05",
+ "fchmod06",
+ "fchown01_16",
+ "fchown02_16",
+ "fchown03_16",
+ "fchown04_16",
+ "fchown05_16",
+ "fcntl07",
+ "fcntl07_64",
+ "fsync01",
+ "ftruncate04",
+ "ftruncate04_64",
+ "getcwd02",
+ "getcwd03",
+ "getegid01_16",
+ "getegid02_16",
+ "geteuid01_16",
+ "geteuid02_16",
+ "getgid01_16",
+ "getgid03_16",
+ "getgroups01_16",
+ "gethostbyname_r01",
+ "getuid01_16",
+ "getuid03_16",
+ "ioctl03",
+ "inotify03",
+ "kill11",
+ "lchown01_16",
+ "lchown02_16",
+ "lchown03_16",
+ "link08",
+ "linkat02",
+ "mkdir02",
+ "mkdir03",
+ "mkdir04",
+ "mkdirat02",
+ "mknod07",
+ "mknodat02",
+ "mmap16",
+ "mount01",
+ "mount02",
+ "mount03",
+ "mount04",
+ "mount06",
+ "move_pages03",
+ "move_pages11",
+ "mprotect01",
+ "nftw01",
+ "nftw6401",
+ "nice04",
+ "open01",
+ "open08",
+ "open10",
+ "open11",
+ "madvise01",
+ "madvise02",
+ "madvise05",
+ "madvise06",
+ "pathconf01",
+ "pause01",
+ "pipe01",
+ "pipe02",
+ "pipe03",
+ "ppoll01",
+ "preadv01",
+ "preadv01_64",
+ "preadv02",
+ "preadv02_64",
+ "process_vm_readv01",
+ "process_vm_writev01",
+ "pwritev01",
+ "pwritev01_64",
+ "pwritev02",
+ "pwritev02_64",
+ "quotactl01",
+ "readlink04",
+ "recvmsg02",
+ "rename09",
+ "rename11",
+ "renameat01",
+ "request_key01",
+ "request_key02",
+ "rmdir02",
+ "rt_sigprocmask01",
+ "sbrk03",
+ "setfsgid01_16",
+ "setfsgid02_16",
+ "setfsgid03_16",
+ "setfsuid01_16",
+ "setfsuid02_16",
+ "setfsuid03_16",
+ "setfsuid04_16",
+ "setgid01_16",
+ "setgid02_16",
+ "setgid03_16",
+ "setgroups01_16",
+ "setgroups02_16",
+ "setgroups03_16",
+ "setgroups04_16",
+ "setregid01_16",
+ "setregid02_16",
+ "setregid03_16",
+ "setregid04_16",
+ "setresgid01_16",
+ "setresgid02_16",
+ "setresgid03_16",
+ "setresgid04_16",
+ "setresuid01_16",
+ "setresuid02_16",
+ "setresuid03_16",
+ "setresuid04_16",
+ "setresuid05_16",
+ "setreuid01_16",
+ "setreuid02_16",
+ "setreuid03_16",
+ "setreuid04_16",
+ "setreuid05_16",
+ "setreuid06_16",
+ "setreuid07_16",
+ "setuid01_16",
+ "setuid02_16",
+ "setuid03_16",
+ "setuid04_16",
+ "splice02",
+ "syscall01",
+ "sysconf01",
+ "syslog01",
+ "syslog02",
+ "syslog03",
+ "syslog04",
+ "syslog05",
+ "syslog06",
+ "syslog07",
+ "syslog08",
+ "syslog09",
+ "syslog10",
+ "umask02",
+ "umask03",
+ "umount01",
+ "umount02",
+ "umount03",
+ "umount2_01",
+ "umount2_02",
+ "umount2_03",
+ "utime03",
+ "utime06",
+ "utimes01",
+ "utimensat01",
+ "waitpid05",
+ "gf01",
+ "gf02",
+ "gf03",
+ "gf04",
+ "gf05",
+ "gf06",
+ "gf07",
+ "gf08",
+ "gf09",
+ "gf10",
+ "gf11",
+ "gf14",
+ "gf15",
+ "gf16",
+ "gf17",
+ "gf18",
+ "gf19",
+ "gf20",
+ "gf21",
+ "gf22",
+ "gf23",
+ "gf24",
+ "gf25",
+ "gf26",
+ "gf27",
+ "gf28",
+ "gf29",
+ "gf30",
+ "rwtest01",
+ "rwtest02",
+ "rwtest03",
+ "rwtest04",
+ "rwtest05",
+ "iogen01",
+ "fs_inod01",
+ "ftest06",
+ "isofs",
+ "fsx_linux",
+ "ddio04",
+ "ddio10",
+ "aio01",
+ "aio02",
+ "mtest06",
+ "shm_test01",
+ "mallocstress01",
+ "mmapstress04",
+ "mmapstress07",
+ "vma03",
+ "min_free_kbytes",
+ "pipeio_1",
+ "pipeio_3",
+ "pipeio_4",
+ "pipeio_5",
+ "pipeio_6",
+ "pipeio_8",
+ "trace_sched01",
+ "float_bessel",
+ "float_exp_log",
+ "float_iperb",
+ "float_power",
+ "float_trigo",
+ "pty01",
+ "mqns_01_clone",
+ "mqns_02_clone",
+ "mqns_03_clone",
+ "mqns_04_clone",
+ "netns_netlink",
+ "netns_breakns_ns_exec_ipv4_netlink",
+ "netns_breakns_ns_exec_ipv6_netlink",
+ "netns_breakns_ns_exec_ipv4_ioctl",
+ "netns_breakns_ns_exec_ipv6_ioctl",
+ "netns_breakns_ip_ipv4_netlink",
+ "netns_breakns_ip_ipv6_netlink",
+ "netns_breakns_ip_ipv4_ioctl",
+ "netns_breakns_ip_ipv6_ioctl",
+ "netns_comm_ns_exec_ipv4_netlink",
+ "netns_comm_ns_exec_ipv6_netlink",
+ "netns_comm_ns_exec_ipv4_ioctl",
+ "netns_comm_ns_exec_ipv6_ioctl",
+ "netns_comm_ip_ipv4_netlink",
+ "netns_comm_ip_ipv6_netlink",
+ "netns_comm_ip_ipv4_ioctl",
+ "netns_comm_ip_ipv6_ioctl",
+ "netns_sysfs",
+ "shmnstest_none",
+ "shmnstest_clone",
+ "shmnstest_unshare",
+ "shmem_2nstest_none",
+ "shmem_2nstest_clone",
+ "shmem_2nstest_unshare",
+ "mesgq_nstest_none",
+ "mesgq_nstest_clone",
+ "mesgq_nstest_unshare",
+ "sem_nstest_none",
+ "sem_nstest_clone",
+ "sem_nstest_unshare",
+ "semtest_2ns_none",
+ "semtest_2ns_clone",
+ "semtest_2ns_unshare",
+ "BindMounts",
+ "Filecaps",
+ "Cap_bounds",
+ "FCNTL_LOCKTESTS",
+ "Connectors",
+ "su01",
+ "cron02",
+ "cron_deny01",
+ "cron_allow01",
+ "cron_dirs_checks01",
+ "Numa_testcases",
+ "move_pages03",
+ "move_pages11",
+ "hugemmap05_1",
+ "hugemmap05_2",
+ "hugemmap05_3",
+ "ar",
+ "ld",
+ "ldd",
+ "nm",
+ "objdump",
+ "file",
+ "tar",
+ "cron",
+ "logrotate",
+ "mail",
+ "cpio",
+ "unzip01",
+ "cp_tests01",
+ "ln_tests01",
+ "mkdir_tests01",
+ "mv_tests01",
+ "size01",
+ "sssd01",
+ "sssd02",
+ "sssd03",
+ "du01",
+ "mkfs01",
+ "which01",
+ "lsmod01",
+ "wc01",
+ "smt_smp_enabled",
+ "smt_smp_affinity",
+ "zram03",
+ "ext4_uninit_groups",
+ "ext4_persist_prealloc",
+ "pipeio_1",
+ "pipeio_4",
+ "pipeio_5",
+ "pipeio_6",
+ "pipeio_8",
+ "cpuhotplug02",
+ "cpuhotplug03",
+ "cpuhotplug06",
+ "input06",
+ "dio10",
+ "fsx_linux",
+ "dio04",
+ "Numa_testcases",
+ "ext4_uninit_groups",
+ "ext4_persist_prealloc",
+ "connect01",
+ "prot_hsymlinks",
+ "fs-ftest01_32bit",
+ "fs-ftest03_32bit",
+ "fs-ftest04_32bit",
+ "fs-ftest05_32bit",
+ "fs-ftest07_32bit",
+ "fs-ftest08_32bit",
+ "fs-inode02_32bit",
+ "ipc-signal_test_01_32bit",
+ "mm-data_space_32bit",
+ "mm-mmapstress01_32bit",
+ "mm-mmapstress03_32bit",
+ "mm-mmapstress09_32bit",
+ "mm-mmapstress10_32bit",
+ "syscalls-clock_nanosleep01_32bit",
+ "syscalls-clone04_32bit",
+ "syscalls-creat08_32bit",
+ "syscalls-fcntl14_32bit",
+ "syscalls-fcntl14_32bit",
+ "syscalls-fcntl14_64_32bit",
+ "syscalls-fcntl17_32bit",
+ "syscalls-fcntl17_64_32bit",
+ "syscalls-getdomainname01_32bit",
+ "syscalls-kill12_32bit",
+ "syscalls-setdomainname01_32bit",
+ "syscalls-setdomainname02_32bit",
+ "syscalls-setdomainname03_32bit",
+ "syscalls-sighold02_32bit",
+ "syscalls-sigpending02_32bit",
+ "syscalls-sigrelse01_32bit",
+ "syscalls-vfork02_32bit",
+ "syscalls-getrusage03_32bit",
+ "syscalls-getrusage04_32bit",
+]
diff --git a/testcases/kernel/ltp/ltp_enums.py b/testcases/kernel/ltp/ltp_enums.py
new file mode 100644
index 0000000..f9a9792
--- /dev/null
+++ b/testcases/kernel/ltp/ltp_enums.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+class RequirementState(object):
+ """Enum for test case requirement check state.
+
+ Attributes:
+ UNCHECKED: test case requirement has not been checked
+ PATHEXISTS: the path of the test case has been verified exist, but
+ all the other requirements have not been checked
+ SATISFIED: all the requirements are satisfied
+ UNSATISFIED: some of the requirements are not satisfied. Test case will
+ not be executed
+ """
+ UNCHECKED = 0
+ PATHEXISTS = 1
+ SATISFIED = 2
+ UNSATISFIED = 3
+
+
+class ConfigKeys(object):
+ RUN_STAGING = "run_staging"
+
+
+class ShellEnvKeys(object):
+ """Shell env keys to run LTP (Linux Test Project) testcases.
+
+ Contains constant strings starting with prefix "_KEY_ENV_" are used as dict
+ key in environment variable dictionary
+ """
+ TMP = 'TMP'
+ TMPBASE = 'TMPBASE'
+ LTPTMP = 'LTPTMP'
+ TMPDIR = 'TMPDIR'
+ LTP_DEV_FS_TYPE = 'LTP_DEV_FS_TYPE'
+ LTPROOT = 'LTPROOT'
+ PATH = 'PATH'
+
+
+class TestExitCode(object):
+ """Exit return codes of LTP test case binary
+
+ Attributes:
+ TPASS: int, exit_code for Test pass
+ TCONF: int, the test case is not for current configuration of kernel
+ TBROK: int, test assumption failed, such as missing system binary and
+ and permission issue not explicitly checked by the test case.
+ SEGFAULT: int, test case results in segmentation fault
+ """
+ TPASS = 0
+ TCONF = 32
+ TBROK = 2
+ SEGFAULT = 139
+
+
+class Requirements(object):
+ """Enum for all ltp requirements"""
+ LOOP_DEVICE_SUPPORT = 1
+ LTP_TMP_DIR = 2
diff --git a/testcases/kernel/ltp/requirements.py b/testcases/kernel/ltp/requirements.py
new file mode 100644
index 0000000..14090f2
--- /dev/null
+++ b/testcases/kernel/ltp/requirements.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from vts.testcases.kernel.ltp import ltp_enums
+from vts.testcases.kernel.ltp import ltp_configs
+from vts.testcases.kernel.ltp.shell_environment.definitions import directory_exists
+from vts.testcases.kernel.ltp.shell_environment.definitions import loop_device_support
+from vts.testcases.kernel.ltp.shell_environment.definitions import path_permission
+
+
+def GetRequrementDefinitions():
+ """Get a dictionary in which keys are requirement names and
+ values are corresponding definition class object or a list
+ of such objects.
+ """
+ return {
+ ltp_enums.Requirements.LOOP_DEVICE_SUPPORT:
+ loop_device_support.LoopDeviceSupport(),
+ ltp_enums.Requirements.LTP_TMP_DIR: [
+ directory_exists.DirectoryExists(
+ paths=[ltp_configs.TMP, ltp_configs.TMPBASE,
+ ltp_configs.LTPTMP, ltp_configs.TMPDIR],
+ to_setup=True,
+ to_cleanup=True), path_permission.PathPermission(
+ paths=[ltp_configs.TMP, ltp_configs.TMPBASE,
+ ltp_configs.LTPTMP, ltp_configs.TMPDIR],
+ permissions=775,
+ to_setup=True,
+ to_cleanup=False)
+ ]
+ }
diff --git a/testcases/kernel/ltp/shell_environment.py b/testcases/kernel/ltp/shell_environment.py
deleted file mode 100644
index b2192be..0000000
--- a/testcases/kernel/ltp/shell_environment.py
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/usr/bin/env python3.4
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-import logging
-
-from vts.runners.host import const
-
-
-class CheckDefinition(object):
- """Environment check definition class
-
- Used to specify what function to call, whether to setup environment after
- check failure, and put additional arguments.
-
- Attributes:
- _function: method, the function to call
- to_setup: bool, whether or not to setup the environment if check returns
- False (given the method will deal with setup case). The default
- value is False
- to_cleanup: whether to clean up after setup. The default value is True
- args: any additional arguments to pass to the method
- """
- def __init__(self, function, to_setup=False, to_cleanup=True, *args):
- self._function = function
- self.to_setup = to_setup
- self.to_cleanup = to_cleanup
- self.args = args
-
- def Execute(self):
- """Execute the specified function"""
- return self._function(self)
-
- def __str__(self):
- return ("Shell Environment Check Definition: function=%s, to_setup=%s"
- " args=%s") % (self._function, self.to_setup, self.args)
-
-class ShellEnvironment(object):
- """Wrapper class for all the environment setup classes.
-
- Provides a bridge between the caller and individual setup classes.
-
- Attributes:
- _shell: shell mirror object, shell to execute commands
- _cleanup_jobs: set of CheckSetupCleanup objects, a set used to store clean
- up jobs if requested.
- """
- def __init__(self, shell):
- self._shell = shell
- # TODO use a queue?
- self._cleanup_jobs = set()
-
- def Cleanup(self):
- """Final cleanup jobs. Will run all the stored cleanup jobs"""
- # TODO check error
- for obj in self._cleanup_jobs:
- obj.Cleanup()
-
- def AddCleanupJob(self, obj):
- """Add a clean up job for final cleanup"""
- self._cleanup_jobs.add(obj)
-
- def ExecuteCommand(self, command):
- """Execute a shell command or a list of shell commands.
-
- Args:
- command: str, the command to execute; Or
- list of str, a list of commands to execute
-
- return:
- True if all commands return exit codes 0; False otherwise
- """
- command_result = self._shell.Execute(command)
- return all([i is 0 for i in command_result[const.EXIT_CODE]])
-
- def LoopDeviceSupport(self, definition):
- """Environment definition function.
- Will create a corresponding setup class and execute
-
- Args:
- definition: CheckDefinition obj, a definition class which stores
- related arguments for the setup class to execute
-
- Return:
- tuple(bool, string), a tuple of True and empty string if success,
- a tuple of False and error message if fail.
- """
- return LoopDeviceSupportClass(definition, self).Execute()
-
- def DirExists(self, definition):
- """Environment definition function.
- Will create a corresponding setup class and execute
-
- Args:
- definition: CheckDefinition obj, a definition class which stores
- related arguments for the setup class to execute
-
- Return:
- tuple(bool, string), a tuple of True and empty string if success,
- a tuple of False and error message if fail.
- """
- return DirExistsClass(definition, self).Execute()
-
- def DirsAllExistAndPermission(self, definition):
- """Environment definition function.
- Will create a corresponding setup class and execute
-
- Args:
- definition: CheckDefinition obj, a definition class which stores
- related arguments for the setup class to execute
-
- Return:
- tuple(bool, string), a tuple of True and empty string if success,
- a tuple of False and error message if fail.
- """
- return DirsAllExistAndPermissionClass(definition, self).Execute()
-
-
-class CheckSetupCleanup(object):
- """An abstract class for defining environment setup job.
-
- Usually such a job contains check -> setup -> cleanup workflow
-
- Attributes:
- _NOTE: string, a message used in GetNote() to display when environment
- check or setup failed.
- context: ShellEnvironment object, the context that can be used to add
- cleanup jobs and execute shell commands
- definition: CheckDefinition object, the definition of a test case
- requirement
- """
- _NOTE = ""
-
- def __init__(self, definition, context):
- self.definition = definition
- self.context = context
-
- def Execute(self):
- """Execute the check, setup, and cleanup.
- Will execute setup and cleanup only if the boolean switches for them
- are True. It will NOT execute cleanup if check function passes.
-
- Return:
- tuple(bool, string), a tuple of True and empty string if success,
- a tuple of False and error message if fail.
- """
- valid_input, message = self.ValidateInput()
- if not valid_input:
- return (valid_input, "Environment check error: %s" % message)
-
- check_result = self.Check()
- if check_result or not self.definition.to_setup:
- return (check_result, self.GetNote())
-
- if self.definition.to_cleanup:
- self.context.AddCleanupJob(self)
-
- return (self.Setup(), self.GetNote())
-
- def GetNote(self):
- """Get a string note as error message. Can be override by sub-class"""
- return "{}\n{}".format(self.NOTE, self.definition)
-
- def ValidateInput(self):
- """Validate input parameters. Can be override by sub-class
-
- Return:
- tuple(bool, string), a tuple of True and empty string if pass,
- a tuple of False and error message if fail.
- """
- return (True, "")
-
- def Check(self):
- """Check function for the class.
- Used to check environment. Can be override by sub-class"""
- return False
-
- def Setup(self):
- """Check function for the class.
- Used to setup environment if check fail. Can be override by sub-class"""
- return False
-
- def Cleanup(self):
- """Check function for the class.
- Used to cleanup setup if check fail. Can be override by sub-class"""
- return False
-
- def ExecuteCommand(self, cmd):
- return self.context.ExecuteCommand(cmd)
-
-
-class LoopDeviceSupportClass(CheckSetupCleanup):
- """Class for checking loopback device support."""
- NOTE = "Kernel does not have loop device support"
-
- def Check(self):
- return self.ExecuteCommand("losetup -f")
-
-class DirExistsClass(CheckSetupCleanup):
- """Class for check, setup, and cleanup a existence of a directory."""
- NOTE = "Directory does not exist"
-
- def ValidateInput(self):
- return (len(self.definition.args) is 1,
- "unexpected arguments in definition: %s" % self.definition)
-
- def Check(self):
- logging.info("Checking existence of directory %s" % definition.args[0])
- return self.ExecuteCommand("ls %s" % self.definition.args[0])
-
- def Setup(self):
- return self.ExecuteCommand("mkdir -p %s" % self.definition.args[0])
-
- def Cleanup(self):
- return self.ExecuteCommand("rm -rf %s" % self.definition.args[0])
-
-
-class DirsAllExistAndPermissionClass(CheckSetupCleanup):
- """Class for check, setup, and cleanup a existence of a list of directories
- and set permissions."""
- NOTE = "Directories do not all exist or have the specified permission"
-
- def ValidateInput(self):
- return (len(self.definition.args) is 2 and \
- len(self.definition.args[0]) == len(self.definition.args[1]),
- "unexpected arguments in definition: %s" % self.definition)
-
- def Check(self):
- dirs = self.definition.args[0]
- permissions = self.definition.args[1]
-
- commands = []
- # TODO(yuexi): "dir" is a reserved word in Python, we should not use
- # it as a var name.
- commands.extend(["ls %s" % dir for dir in dirs])
- commands.extend(["stat -c {}a {}".format('%', *pair)
- for pair in zip(permissions, dirs)])
-
- return self.ExecuteCommand(commands)
-
- def Setup(self):
- dirs = self.definition.args[0]
- permissions = self.definition.args[1]
-
- commands = []
- commands.extend(["mkdir -p %s" % dir for dir in dirs])
- commands.extend(["chmod {} {}".format(*pair)
- for pair in zip(permissions, dirs)])
-
- return self.ExecuteCommand(commands)
-
- def Cleanup(self):
- commands = ["rm -rf %s" % dir for dir in self.definition.args[0]]
- return self.ExecuteCommand(commands)
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/kernel/ltp/shell_environment/__init__.py
similarity index 100%
rename from testcases/kernel/ltp_adb/__init__.py
rename to testcases/kernel/ltp/shell_environment/__init__.py
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/kernel/ltp/shell_environment/definitions/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/kernel/ltp/shell_environment/definitions/__init__.py
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/kernel/ltp/shell_environment/definitions/base_definitions/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/kernel/ltp/shell_environment/definitions/base_definitions/__init__.py
diff --git a/testcases/kernel/ltp/shell_environment/definitions/base_definitions/check_setup_cleanup.py b/testcases/kernel/ltp/shell_environment/definitions/base_definitions/check_setup_cleanup.py
new file mode 100644
index 0000000..4c09196
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/base_definitions/check_setup_cleanup.py
@@ -0,0 +1,224 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import itertools
+
+from vts.runners.host import const
+
+
+class CheckSetupCleanup(object):
+ """An abstract class for defining environment setup job.
+
+ Usually such a job contains check -> setup -> cleanup workflow
+
+ Attributes:
+ to_check: bool, whether or not to check the defined environment
+ requirement. Default: True
+ to_setup: bool, whether or not to setup the defined environment
+ requirement. Default: False
+ to_cleanup: bool, whether or not to cleanup the defined environment
+ requirement if it is set up by this class. Default: False
+ context: ShellEnvironment object that provides AddCleanupJobs and
+ ExecuteShellCommand method
+ note: string, used by GetNote to generate error message if fail.
+ """
+
+ def __init__(self):
+ self.to_check = True
+ self.to_setup = False
+ self.to_cleanup = False
+ self.context = None
+ self.note = None
+
+ @property
+ def note(self):
+ return self._note
+
+ @note.setter
+ def note(self, note):
+ self._note = note
+
+ @property
+ def context(self):
+ return self._context
+
+ @context.setter
+ def context(self, context):
+ self._context = context
+
+ def Execute(self):
+ """Execute the check, setup, and cleanup.
+ Will execute setup and cleanup only if the boolean switches for them
+ are True. It will NOT execute cleanup if check function passes.
+
+ Return:
+ tuple(bool, string), a tuple of True and empty string if success,
+ a tuple of False and error message if fail.
+ """
+
+ if self.context is None:
+ self.note = "Error: Environment definition context not set"
+ return False
+
+ if not self.InternalCall(self.ValidateInput):
+ return False
+
+ check_result = False
+ if self.to_check:
+ check_result = self.InternalCall(self.Check)
+
+ if check_result or not self.to_setup:
+ return check_result
+
+ if self.to_cleanup:
+ self.context.AddCleanupJob(self.InternalCall, self.Cleanup)
+
+ return self.InternalCall(self.Setup)
+
+ def __str__(self):
+ return ("Shell Environment Check Definition Class:{cls} "
+ "Variables:{props}").format(
+ msg=message, cls=self.__class__.__name__, props=vars(self))
+
+ def GetNote(self):
+ """Get a string note as error message. Can be override by sub-class"""
+ if not self.note:
+ self.note = "Shell environment definition unsatisfied"
+ return "{}\nat: {}".format(self.note, self)
+
+ def InternalCall(self, method):
+ """Base definition's internal method to call sub class inherited
+ methods, check results and put note if not set
+ """
+ self.note = None
+ success = method()
+ if not success and not self.note:
+ self.note = ("Shell environment definition unsatisfied: step [%s] "
+ "failed.") % method.__name__
+ return success
+
+ def ValidateInput(self):
+ """Validate input parameters. Can be override by sub-class
+
+ Return:
+ tuple(bool, string), a tuple of True and empty string if pass,
+ a tuple of False and error message if fail.
+ """
+ return True
+
+ def ToListLike(self, obj):
+ """Convert single item to list of single item. If input is already
+ a list like object, the same object will be returned.
+ This method is for the convenience of writing child class.
+
+ Arguments:
+ obj: any object
+ """
+ if not self.IsListLike(obj):
+ return [obj]
+ else:
+ return obj
+
+ def IsListLike(self, obj):
+ """Checks whether a object is list-like.
+
+ This method is for the convenience of writing child class.
+ This method will check for existence of __iter__ and __getitem__
+ in attributes of the object.
+ String is not considered list-like, tuple is.
+
+ Arguments:
+ obj: any object
+ """
+ return hasattr(obj, '__iter__') and hasattr(obj, '__getitem__')
+
+ def NormalizeInputLists(self, *inputs):
+ """Normalize inputs to lists of same length.
+
+ This method is for the convenience of writing child class.
+ If there are lists in inputs, they should all be of same length;
+ otherwise, None is returned.
+ If there are lists and single items in inputs, single items are
+ duplicated to a list of other list's length.
+ If there are only single items in inputs, they all get converted to
+ single item lists.
+
+ Arguments:
+ inputs: any inputs
+
+ Return:
+ a generator of normalized inputs
+ """
+ # If any of inputs is None or empty, inputs are considered not valid
+ # Definition classes wish to take None input should not use this method
+ if not all(inputs):
+ return None
+
+ lists = filter(self.IsListLike, inputs)
+ if not lists:
+ # All inputs are single items. Convert them to lists
+ return ([i] for i in inputs)
+
+ lengths = set(map(len, lists))
+ if len(lengths) != 1:
+ # lists in inputs have different lengths, cannot normalize
+ return None
+ length = lengths.pop()
+
+ return (i if self.IsListLike(i) else list(itertools.repeat(i, length))
+ for i in inputs)
+
+ def Check(self):
+ """Check function for the class.
+ Used to check environment. Can be override by sub-class
+ """
+ self.note = "Check step undefined."
+ return False
+
+ def Setup(self):
+ """Check function for the class.
+ Used to setup environment if check fail. Can be override by sub-class
+ """
+ self.note = "Setup step undefined."
+ return False
+
+ def Cleanup(self):
+ """Check function for the class.
+ Used to cleanup setup if check fail. Can be override by sub-class
+ """
+ self.note = "Cleanup step undefined."
+ return False
+
+ @property
+ def shell(self):
+ """returns an object that can execute a shell command"""
+ return self.context.shell
+
+ def ExecuteShellCommand(self, cmd):
+ """Execute a shell command or a list of shell commands.
+
+ Args:
+ command: str, the command to execute; Or
+ list of str, a list of commands to execute
+
+ return:
+ A dictionary containing results in format:
+ {const.STDOUT: [stdouts],
+ const.STDERR: [stderrs],
+ const.EXIT_CODE: [exit_codes]}.
+ """
+ return self.shell.Execute(cmd)
diff --git a/testcases/kernel/ltp/shell_environment/definitions/directory_exists.py b/testcases/kernel/ltp/shell_environment/definitions/directory_exists.py
new file mode 100644
index 0000000..682d623
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/directory_exists.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment.definitions.base_definitions import check_setup_cleanup
+
+
+class DirectoryExists(check_setup_cleanup.CheckSetupCleanup):
+ """Class for check existence of directories, make directories if not,
+ and delete afterwards.
+
+ Attributes:
+ to_check: bool, whether or not to check the defined environment
+ requirement. Default: True
+ to_setup: bool, whether or not to setup the defined environment
+ requirement. Default: False
+ to_cleanup: bool, whether or not to cleanup the defined environment
+ requirement if it is set up by this class. Default: False
+ _paths: list string, target directory paths
+ _failed_paths: list of string, paths that don't have desired permissions
+ _permissions: list of int, desired permissions for each path
+ """
+
+ def __init__(self,
+ paths=None,
+ to_check=True,
+ to_setup=False,
+ to_cleanup=False):
+ self._paths = paths
+ self.to_check = to_check
+ self.to_setup = to_setup
+ self.to_cleanup = to_cleanup
+
+ def ValidateInput(self):
+ """Validate input paths is not null or empty list
+ or list containing empty string. If input is a single path, it will
+ be converted to a single item list containing that path.
+ """
+ if not self._paths:
+ return False
+
+ self._paths = self.ToListLike(self._paths)
+
+ return all(self._paths)
+
+ def Check(self):
+ commands = ["ls %s" % path for path in self._paths]
+ results = self.ExecuteShellCommand(commands)[const.EXIT_CODE]
+
+ self._failed_paths = [
+ path for path, fail in zip(self._paths, map(bool, results)) if fail
+ ]
+
+ if not self._failed_paths:
+ return True
+
+ self.note = "Some directories do not exist: %s" % self._failed_paths
+ return False
+
+ def Setup(self):
+ commands = ["mkdir -p %s" % path for path in self._failed_paths]
+ # TODO: perhaps store or print failed setup paths
+ return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
+
+ def Cleanup(self):
+ commands = ["rm -rf %s" % path for path in self._failed_paths]
+ return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
diff --git a/testcases/kernel/ltp/shell_environment/definitions/loop_device_support.py b/testcases/kernel/ltp/shell_environment/definitions/loop_device_support.py
new file mode 100644
index 0000000..2e07772
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/loop_device_support.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment.definitions.base_definitions import check_setup_cleanup
+
+
+class LoopDeviceSupport(check_setup_cleanup.CheckSetupCleanup):
+ """Class for checking loopback device support."""
+ note = "Kernel does not have loop device support"
+
+ def Check(self):
+ return not self.ExecuteCommand("losetup -f")[const.EXIT_CODE][0]
diff --git a/testcases/kernel/ltp/shell_environment/definitions/path_permission.py b/testcases/kernel/ltp/shell_environment/definitions/path_permission.py
new file mode 100644
index 0000000..761a04d
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/definitions/path_permission.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from vts.runners.host import const
+from vts.testcases.kernel.ltp.shell_environment.definitions.base_definitions import check_setup_cleanup
+
+
+class PathPermission(check_setup_cleanup.CheckSetupCleanup):
+ """Class for check and set path permissions.
+
+ Attributes:
+ to_check: bool, whether or not to check the defined environment
+ requirement. Default: True
+ to_setup: bool, whether or not to setup the defined environment
+ requirement. Default: False
+ to_cleanup: bool, whether or not to cleanup the defined environment
+ requirement if it is set up by this class. Default: False
+ _paths: list string, target paths
+ _failed_paths: list of string, paths that don't have desired permissions
+ _permissions: list of int, desired permissions for each path
+ """
+
+ def __init__(self,
+ paths=None,
+ permissions=None,
+ to_check=True,
+ to_setup=False,
+ to_cleanup=False):
+ self._paths = paths
+ self._permissions = permissions
+ self.to_check = to_check
+ self.to_setup = to_setup
+ self.to_cleanup = to_cleanup
+
+ def ValidateInput(self):
+ """Validate input lists is not null or empty list
+ or list containing empty string, and two lists containing same number
+ of items. If inputs are two single item, they will
+ be converted to single item lists.
+ """
+ normalized = self.NormalizeInputLists(self._paths, self._permissions)
+ if not normalized:
+ return False
+ self._paths, self._permissions = normalized
+
+ return True
+
+ def Check(self):
+ commands = ["stat -c {}a {}".format('%', path) for path in self._paths]
+ results = self.ExecuteShellCommand(commands)[const.STDOUT]
+
+ self._failed_paths = [
+ (path, permission, result)
+ for path, permission, result in zip(self._paths, self._permissions,
+ results)
+ if str(permission) != result
+ ]
+
+ if not self._failed_paths:
+ return True
+
+ self.note = ("Some paths do not have desired "
+ "permission: %s") % self._failed_paths
+ return False
+
+ def Setup(self):
+ commands = ["chmod {} {}".format(permission, path)
+ for (path, permission, result) in self._failed_paths]
+ # TODO: perhaps store or print failed setup paths
+ return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
+
+ def Cleanup(self):
+ commands = ["chmod {} {}".format(original, path)
+ for (path, permission, original) in self._failed_paths]
+ return not any(self.ExecuteShellCommand(commands)[const.EXIT_CODE])
diff --git a/testcases/kernel/ltp/shell_environment/shell_environment.py b/testcases/kernel/ltp/shell_environment/shell_environment.py
new file mode 100644
index 0000000..a946314
--- /dev/null
+++ b/testcases/kernel/ltp/shell_environment/shell_environment.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import types
+
+
+class ShellEnvironment(object):
+ """Class for executing environment definition classes and do cleanup jobs.
+
+ Attributes:
+ shell: shell mirror object, shell to execute commands
+ _cleanup_jobs: set of CheckSetupCleanup objects, a set used to store
+ clean up jobs if requested.
+ """
+
+ def __init__(self, shell):
+ self.shell = shell
+ self._cleanup_jobs = []
+
+ def Cleanup(self):
+ """Final cleanup jobs. Will run all the stored cleanup jobs"""
+ return all([method(*args) for method, args in self._cleanup_jobs])
+
+ def AddCleanupJob(self, method, *args):
+ """Add a clean up job for final cleanup"""
+ if (method, args) not in self._cleanup_jobs:
+ self._cleanup_jobs.append((method, args))
+
+ @property
+ def shell(self):
+ """returns an object that can execute a shell command"""
+ return self._shell
+
+ @shell.setter
+ def shell(self, shell):
+ self._shell = shell
+
+ def ExecuteDefinitions(self, definitions):
+ if not isinstance(definitions, types.ListType):
+ definitions = [definitions]
+
+ for definition in definitions:
+ definition.context = self
+ if not definition.Execute():
+ return (False, definition.GetNote())
+
+ return (True, "")
diff --git a/testcases/kernel/ltp/stable/Android.mk b/testcases/kernel/ltp/stable/Android.mk
new file mode 100644
index 0000000..4f4208a
--- /dev/null
+++ b/testcases/kernel/ltp/stable/Android.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := KernelLtpTest
+LOCAL_MODULE_CLASS := FAKE
+LOCAL_IS_HOST_MODULE := true
+LOCAL_COMPATIBILITY_SUITE := vts
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE):
+ @echo "VTS host-driven test target: $(LOCAL_MODULE)"
+ $(hide) touch $@
+
+VTS_CONFIG_SRC_DIR := testcases/kernel/ltp/stable
+include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/kernel/ltp/AndroidTest.xml b/testcases/kernel/ltp/stable/AndroidTest.xml
similarity index 98%
copy from testcases/kernel/ltp/AndroidTest.xml
copy to testcases/kernel/ltp/stable/AndroidTest.xml
index f437de7..9b5ea0f 100644
--- a/testcases/kernel/ltp/AndroidTest.xml
+++ b/testcases/kernel/ltp/stable/AndroidTest.xml
@@ -51,6 +51,6 @@
<test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
<option name="test-timeout" value="3000000" />
<option name="test-case-path" value="vts/testcases/kernel/ltp/KernelLtpTest" />
- <option name="test-config-path" value="vts-config/testcases/kernel/ltp/KernelLtpTest.config" />
+ <option name="test-config-path" value="vts-config/testcases/kernel/ltp/stable/KernelLtpTest.config" />
</test>
</configuration>
diff --git a/testcases/kernel/ltp/KernelLtpTest.config b/testcases/kernel/ltp/stable/KernelLtpTest.config
similarity index 66%
copy from testcases/kernel/ltp/KernelLtpTest.config
copy to testcases/kernel/ltp/stable/KernelLtpTest.config
index b531d10..414f6fd 100644
--- a/testcases/kernel/ltp/KernelLtpTest.config
+++ b/testcases/kernel/ltp/stable/KernelLtpTest.config
@@ -7,6 +7,7 @@
}
],
"log_path": "/tmp/logs",
- "test_paths": ["./"],
- "use_gae_db": true
+ "test_paths": ["../"],
+ "use_gae_db": true,
+ "run_staging": false
}
diff --git a/testcases/kernel/ltp/staging/Android.mk b/testcases/kernel/ltp/staging/Android.mk
new file mode 100644
index 0000000..172e707
--- /dev/null
+++ b/testcases/kernel/ltp/staging/Android.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := KernelLtpStagingTest
+LOCAL_MODULE_CLASS := FAKE
+LOCAL_IS_HOST_MODULE := true
+LOCAL_COMPATIBILITY_SUITE := vts
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE):
+ @echo "VTS host-driven test target: $(LOCAL_MODULE)"
+ $(hide) touch $@
+
+VTS_CONFIG_SRC_DIR := testcases/kernel/ltp/staging
+include test/vts/tools/build/Android.host_config.mk
diff --git a/testcases/kernel/ltp/AndroidTest.xml b/testcases/kernel/ltp/staging/AndroidTest.xml
similarity index 98%
rename from testcases/kernel/ltp/AndroidTest.xml
rename to testcases/kernel/ltp/staging/AndroidTest.xml
index f437de7..5621c5c 100644
--- a/testcases/kernel/ltp/AndroidTest.xml
+++ b/testcases/kernel/ltp/staging/AndroidTest.xml
@@ -51,6 +51,6 @@
<test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
<option name="test-timeout" value="3000000" />
<option name="test-case-path" value="vts/testcases/kernel/ltp/KernelLtpTest" />
- <option name="test-config-path" value="vts-config/testcases/kernel/ltp/KernelLtpTest.config" />
+ <option name="test-config-path" value="vts-config/testcases/kernel/ltp/staging/KernelLtpTest.config" />
</test>
</configuration>
diff --git a/testcases/kernel/ltp/staging/KernelLtpStagingTest.config b/testcases/kernel/ltp/staging/KernelLtpStagingTest.config
new file mode 100644
index 0000000..eddb282
--- /dev/null
+++ b/testcases/kernel/ltp/staging/KernelLtpStagingTest.config
@@ -0,0 +1,13 @@
+{
+ "test_bed":
+ [
+ {
+ "name": "VTS-Kernel-LTP-Staging",
+ "AndroidDevice": "*"
+ }
+ ],
+ "log_path": "/tmp/logs",
+ "test_paths": ["../"],
+ "use_gae_db": true,
+ "run_staging": true
+}
diff --git a/testcases/kernel/ltp/test_case.py b/testcases/kernel/ltp/test_case.py
new file mode 100644
index 0000000..44309a8
--- /dev/null
+++ b/testcases/kernel/ltp/test_case.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.testcases.kernel.ltp import ltp_enums
+
+
+class TestCase(object):
+ """Stores name, path, and param information for each test case.
+
+ Attributes:
+ testsuite: string, name of testsuite to which the testcase belongs
+ testname: string, name of the test case
+ path: string, test binary path
+ _args: list of string, test case command line arguments
+ requirement_state: RequirementState, enum representing requirement
+ check results
+ note: string, a place to store additional note for the test case
+ such as what environment requirement did not satisfy.
+ """
+
+ def __init__(self, testsuite, testname, path, args):
+ self.testsuite = testsuite
+ self.testname = testname
+ self.path = path
+ self._args = args
+ self.requirement_state = ltp_enums.RequirementState.UNCHECKED
+ self.note = None
+
+ @property
+ def note(self):
+ """Get the note"""
+ return self._note
+
+ @note.setter
+ def note(self, note):
+ """Set the note"""
+ self._note = note
+
+ @property
+ def requirement_state(self):
+ """Get the requirement state"""
+ return self._requirement_state
+
+ @requirement_state.setter
+ def requirement_state(self, requirement_state):
+ """Set the requirement state"""
+ self._requirement_state = requirement_state
+
+ @property
+ def testsuite(self):
+ """Get the test suite's name."""
+ return self._testsuite
+
+ @testsuite.setter
+ def testsuite(self, testsuite):
+ """Set the test suite's name."""
+ self._testsuite = testsuite
+
+ @property
+ def testname(self):
+ """Get the test case's name."""
+ return self._testname
+
+ @testname.setter
+ def testname(self, testname):
+ """Set the test case's name."""
+ self._testname = testname
+
+ @property
+ def path(self):
+ """Get the test binary's file name."""
+ return self._path
+
+ @path.setter
+ def path(self, path):
+ """Set the test testbinary's name."""
+ self._path = path
+
+ def GetArgs(self, replace_string_from=None, replace_string_to=None):
+ """Get the case arguments in string format.
+
+ if replacement string is provided, arguments will be
+ filtered with the replacement string
+
+ Args:
+ replace_string_from: string, replacement string source, if any
+ replace_string_to: string, replacement string destination, if any
+
+ Returns:
+ string, arguments formated in space separated string
+ """
+ if replace_string_from is None or replace_string_to is None:
+ return ' '.join(self._args)
+ else:
+ return ' '.join([p.replace(replace_string_from, replace_string_to)
+ for p in self._args])
+
+ def __str__(self):
+ return "%s-%s" % (self.testsuite, self.testname)
diff --git a/testcases/kernel/ltp/test_cases_parser.py b/testcases/kernel/ltp/test_cases_parser.py
new file mode 100644
index 0000000..2469349
--- /dev/null
+++ b/testcases/kernel/ltp/test_cases_parser.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os
+
+from vts.testcases.kernel.ltp import ltp_configs
+from vts.testcases.kernel.ltp import test_case
+
+
+class TestCasesParser(object):
+ """Load a ltp vts testcase definition file and parse it into a generator.
+
+ Attributes:
+ _data_path: string, the vts data path on host side
+ """
+
+ def __init__(self, data_path):
+ self._data_path = data_path
+
+ def IsTestcaseInList(self, testcase, name_list, n_bit):
+ """Check whether a given testcase object is in a disabled test list"""
+ name_set = (testcase, testcase.testname,
+ "{test_name}_%{n_bit}bit".format(
+ test_name=testcase.testname, n_bit=n_bit))
+ return len(set(name_set).intersection(name_list)) > 0
+
+ def Load(self, ltp_dir, n_bit, run_staging=False):
+ """Read the definition file and return a TestCase generator."""
+ case_definition_path = os.path.join(self._data_path, n_bit, 'ltp',
+ 'ltp_vts_testcases.txt')
+
+ with open(case_definition_path, 'r') as f:
+ for line in f:
+ items = line.split('\t')
+ if not len(items) == 4:
+ continue
+
+ testsuite, testname, testbinary, arg = items
+ args = arg.strip().split(',')
+
+ if testname.startswith("DISABLED_"):
+ continue
+
+ testcase = test_case.TestCase(
+ testsuite, testname, os.path.join(ltp_dir, 'testcases/bin',
+ testbinary), args)
+
+ if self.IsTestcaseInList(testcase, ltp_configs.DISABLED_TESTS,
+ n_bit):
+ continue
+
+ if (not run_staging and self.IsTestcaseInList(
+ testcase, ltp_configs.STAGING_TESTS, n_bit)):
+ continue
+
+ yield testcase
diff --git a/testcases/kernel/ltp_adb/AndroidTest.xml b/testcases/kernel/ltp_adb/AndroidTest.xml
deleted file mode 100644
index e4fd54d..0000000
--- a/testcases/kernel/ltp_adb/AndroidTest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<configuration description="Config for VTS kernel LTP ADB test cases">
- <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
- <option name="cleanup" value="true" />
- <option name="append-bitness" value="false" />
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
- <option name="dep-module" value="future" />
- <option name="dep-module" value="futures" />
- <option name="dep-module" value="enum" />
- <option name="dep-module" value="protobuf" />
- </target_preparer>
- <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
- <option name="test-timeout" value="3000000" />
- <option name="test-case-path" value="vts/testcases/kernel/ltp_adb/KernelLtpAdbTest" />
- <option name="test-config-path" value="vts-config/testcases/kernel/ltp_adb/KernelLtpAdbTest.config" />
- </test>
-</configuration>
diff --git a/testcases/kernel/ltp_adb/KernelLtpAdbTest.config b/testcases/kernel/ltp_adb/KernelLtpAdbTest.config
deleted file mode 100644
index 4954ca3..0000000
--- a/testcases/kernel/ltp_adb/KernelLtpAdbTest.config
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "test_bed":
- [
- {
- "name": "VTS-Kernel-LTP-ADB",
- "AndroidDevice": "*",
- "use_vts_agent": false
- }
- ],
- "log_path": "/tmp/logs",
- "test_paths": ["./"],
- "use_gae_db": true
-}
diff --git a/testcases/kernel/ltp_adb/KernelLtpAdbTest.py b/testcases/kernel/ltp_adb/KernelLtpAdbTest.py
deleted file mode 100644
index 7068d7b..0000000
--- a/testcases/kernel/ltp_adb/KernelLtpAdbTest.py
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/usr/bin/env python3.4
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-import logging
-import os
-import subprocess
-import types
-
-from vts.runners.host import const
-from vts.runners.host import keys
-from vts.runners.host import test_runner
-from vts.utils.python.controllers import android_device
-
-from vts.testcases.kernel.ltp import KernelLtpTest
-from vts.testcases.kernel.ltp import KernelLtpTestHelper
-
-
-class DutWrapper(object):
- """Wrapper class for AndroidDevice object."""
- def __init__(self, dut):
- self._dut = dut
- self._shell = AdbWrapperForShell()
-
- @property
- def adb(self):
- """Returns original adb member"""
- return self._dut.adb
-
- @property
- def shell(self):
- """Returns a adb wrapped shell that mimic behavior of a shell mirror"""
- return self._shell
-
-
-class AdbWrapperForShell(object):
- """A adb wrapped shell that mimic behavior of a shell mirror"""
-
- def InvokeTerminal(self, name):
- """Since we are using adb to execute shell commands, this method does nothing"""
- pass
-
- def ExecuteOneCommand(self, cmd):
- """Execute one shell command using adb and return stdout, stderr, exit_code"""
- p = subprocess.Popen("adb shell {}".format(cmd) , shell=True,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout, stderr = p.communicate()
- return (stdout, stderr, p.returncode)
-
- def Execute(self, command):
- """Execute one shell command or a list of shell commands"""
- if not isinstance(command, types.ListType):
- command = [command]
-
- results = [self.ExecuteOneCommand(cmd) for cmd in command]
- stdout, stderr, exit_code = zip(*results)
- return {const.STDOUT: stdout,
- const.STDERR: stderr,
- const.EXIT_CODE: exit_code}
-
- def __getattr__(self, name):
- return self
-
-
-class KernelLtpAdbTest(KernelLtpTest.KernelLtpTest):
- """Runs the LTP (Linux Test Project) testcases against Android OS kernel.
-
- This class is a child class of KernelLtpTest. The only difference is this class
- uses adb shell to execute command instead of using target shell driver.
-
- Attributes:
- _TPASS: int, exit_code for Test pass
- _TCONF: int, The test case is not for current configuration of kernel
- _32BIT: int, for 32 bit tests
- _64BIT: int, for 64 bit tests
- _dut: AndroidDevice, the device under test
- _shell: ShellMirrorObject, shell mirror object used to execute commands
- _ltp_dir: string, ltp build root directory on target
- _testcases: TestcasesParser, test case input parser
- _env: dict<stirng, stirng>, dict of environment variable key value pair
- _KEY_ENV__: constant strings starting with prefix "_KEY_ENV_" are used as dict
- key in environment variable dictionary
- """
- def setUpClass(self):
- """Creates a remote shell instance, and copies data files."""
- required_params = [keys.ConfigKeys.IKEY_DATA_FILE_PATH]
- self.getUserParams(required_params)
-
- logging.info("data_file_path: %s", self.data_file_path)
- self._dut = DutWrapper(self.registerController(android_device)[0])
- self._dut.shell.InvokeTerminal("one")
- self._shell = self._dut.shell.one
- self._ltp_dir = "/data/local/tmp/ltp"
-
- self._requirement = KernelLtpTestHelper.EnvironmentRequirementChecker(
- self._shell)
-
- self._testcases = KernelLtpTestHelper.TestCasesParser(
- self.data_file_path)
- self._env = {self._KEY_ENV_TMPDIR: KernelLtpTestHelper.LTPTMP,
- self._KEY_ENV_TMP: "%s/tmp" % KernelLtpTestHelper.LTPTMP,
- self._KEY_ENV_LTP_DEV_FS_TYPE: "ext4",
- self._KEY_ENV_LTPROOT: self._ltp_dir,
- self._KEY_ENV_PATH:
- "/system/bin:%s/testcases/bin" % self._ltp_dir, }
-
-if __name__ == "__main__":
- test_runner.main()
diff --git a/testcases/kernel/ltp_adb/__init__.pyc b/testcases/kernel/ltp_adb/__init__.pyc
deleted file mode 100644
index bee6be0..0000000
--- a/testcases/kernel/ltp_adb/__init__.pyc
+++ /dev/null
Binary files differ
diff --git a/testcases/system/Android.mk b/testcases/system/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/testcases/system/Android.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/system/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/system/__init__.py
diff --git a/testcases/system/qtaguid/Android.mk b/testcases/system/qtaguid/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/testcases/system/qtaguid/Android.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/system/qtaguid/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/system/qtaguid/__init__.py
diff --git a/testcases/kernel/ltp_adb/Android.mk b/testcases/system/qtaguid/sample/Android.mk
similarity index 78%
rename from testcases/kernel/ltp_adb/Android.mk
rename to testcases/system/qtaguid/sample/Android.mk
index 2168817..67a85aa 100644
--- a/testcases/kernel/ltp_adb/Android.mk
+++ b/testcases/system/qtaguid/sample/Android.mk
@@ -2,7 +2,7 @@
include $(CLEAR_VARS)
-LOCAL_MODULE := KernelLtpAdbTest
+LOCAL_MODULE := sample_qtaguid_test
LOCAL_MODULE_CLASS := FAKE
LOCAL_IS_HOST_MODULE := true
LOCAL_COMPATIBILITY_SUITE := vts
@@ -13,6 +13,5 @@
@echo "VTS host-driven test target: $(LOCAL_MODULE)"
$(hide) touch $@
-VTS_CONFIG_SRC_DIR := testcases/kernel/ltp_adb
+VTS_CONFIG_SRC_DIR := testcases/system/qtaguid/sample
include test/vts/tools/build/Android.host_config.mk
-
diff --git a/testcases/kernel/ltp/AndroidTest.xml b/testcases/system/qtaguid/sample/AndroidTest.xml
similarity index 86%
copy from testcases/kernel/ltp/AndroidTest.xml
copy to testcases/system/qtaguid/sample/AndroidTest.xml
index f437de7..9f75855 100644
--- a/testcases/kernel/ltp/AndroidTest.xml
+++ b/testcases/system/qtaguid/sample/AndroidTest.xml
@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<configuration description="Config for VTS kernel LTP test cases">
+<configuration description="Config for VTS system sample qtaguid test cases">
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
<option name="cleanup" value="true" />
<option name="push" value="libvts_common.so->/data/local/tmp/32/libvts_common.so" />
@@ -32,14 +32,15 @@
<option name="push" value="libvts_multidevice_proto64.so->/data/local/tmp/64/libvts_multidevice_proto.so" />
<option name="push" value="libhwbinder.so->/data/local/tmp/32/libhwbinder.so" />
<option name="push" value="libhwbinder64.so->/data/local/tmp/64/libhwbinder.so" />
- <option name="push" value="libprotobuf-cpp-full.so->/data/local/tmp/32/libprotobuf-cpp-full.so" />
- <option name="push" value="libprotobuf-cpp-full64.so->/data/local/tmp/64/libprotobuf-cpp-full.so" />
+ <option name="push" value="lights.bullhead-vts.so->/data/local/tmp/32/lights.bullhead-vts.so" />
+ <option name="push" value="lights.bullhead-vts64.so->/data/local/tmp/64/lights.bullhead-vts.so" />
<option name="push" value="fuzzer32->/data/local/tmp/32/fuzzer32" />
<option name="push" value="fuzzer64->/data/local/tmp/64/fuzzer64" />
<option name="push" value="vts_shell_driver32->/data/local/tmp/32/vts_shell_driver32" />
<option name="push" value="vts_shell_driver64->/data/local/tmp/64/vts_shell_driver64" />
<option name="push" value="vts_hal_agent32->/data/local/tmp/32/vts_hal_agent32" />
<option name="push" value="vts_hal_agent64->/data/local/tmp/64/vts_hal_agent64" />
+ <option name="push" value="libcutilsV1.vts->/data/local/tmp/spec/libcutilsV1.vts" />
<option name="append-bitness" value="false" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
@@ -49,8 +50,7 @@
<option name="dep-module" value="protobuf" />
</target_preparer>
<test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
- <option name="test-timeout" value="3000000" />
- <option name="test-case-path" value="vts/testcases/kernel/ltp/KernelLtpTest" />
- <option name="test-config-path" value="vts-config/testcases/kernel/ltp/KernelLtpTest.config" />
+ <option name="test-case-path" value="vts/testcases/system/qtaguid/sample/sample_qtaguid_test" />
+ <option name="test-config-path" value="vts-config/testcases/system/qtaguid/sample/sample_qtaguid_test.config" />
</test>
</configuration>
diff --git a/testcases/kernel/ltp_adb/__init__.py b/testcases/system/qtaguid/sample/__init__.py
similarity index 100%
copy from testcases/kernel/ltp_adb/__init__.py
copy to testcases/system/qtaguid/sample/__init__.py
diff --git a/testcases/kernel/ltp/KernelLtpTest.config b/testcases/system/qtaguid/sample/sample_qtaguid_test.config
similarity index 76%
rename from testcases/kernel/ltp/KernelLtpTest.config
rename to testcases/system/qtaguid/sample/sample_qtaguid_test.config
index b531d10..f56e768 100644
--- a/testcases/kernel/ltp/KernelLtpTest.config
+++ b/testcases/system/qtaguid/sample/sample_qtaguid_test.config
@@ -2,7 +2,7 @@
"test_bed":
[
{
- "name": "VTS-Kernel-LTP",
+ "name": "VTS-System-Qtaguid-Sample",
"AndroidDevice": "*"
}
],
diff --git a/testcases/system/qtaguid/sample/sample_qtaguid_test.py b/testcases/system/qtaguid/sample/sample_qtaguid_test.py
new file mode 100644
index 0000000..16015e4
--- /dev/null
+++ b/testcases/system/qtaguid/sample/sample_qtaguid_test.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3.4
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+
+from vts.runners.host import base_test_with_webdb
+from vts.runners.host import test_runner
+from vts.utils.python.controllers import android_device
+
+
+class SampleQtaguidTest(base_test_with_webdb.BaseTestWithWebDbClass):
+ """A sample testcase for the libcutil's qtaguid module."""
+
+ def setUpClass(self):
+ self.dut = self.registerController(android_device)[0]
+ self.dut.lib.InitSharedLib(target_type="vndk_libcutils",
+ target_basepaths=["/system/lib64"],
+ target_version=1.0,
+ target_filename="libcutils.so",
+ bits=64,
+ handler_name="libcutils")
+
+ def testCall(self):
+ """A simple testcase which just calls a function."""
+ result = self.dut.lib.libcutils.qtaguid_tagSocket(0, 1, 2)
+ logging.info("result: %s", result)
+
+
+if __name__ == "__main__":
+ test_runner.main()
diff --git a/tools/vts-tradefed/res/config/vts-kernel.xml b/tools/vts-tradefed/res/config/vts-kernel.xml
index 5917aa2..6294b09 100644
--- a/tools/vts-tradefed/res/config/vts-kernel.xml
+++ b/tools/vts-tradefed/res/config/vts-kernel.xml
@@ -16,6 +16,6 @@
<configuration description="Run VTS Kernel and Kernel Module Tests">
<include name="everything" />
<option name="compatibility:plan" value="vts" />
- <option name="compatibility:include-filter" value="KernelLtpAdbTest" />
+ <option name="compatibility:include-filter" value="KernelLtpTest" />
<template-include name="reporters" default="basic-reporters" />
</configuration>
diff --git a/tools/vts-tradefed/res/config/vts-staging.xml b/tools/vts-tradefed/res/config/vts-staging.xml
index 8fb0e7c..80cfb09 100644
--- a/tools/vts-tradefed/res/config/vts-staging.xml
+++ b/tools/vts-tradefed/res/config/vts-staging.xml
@@ -17,6 +17,6 @@
<include name="everything" />
<option name="compatibility:plan" value="vts" />
<option name="compatibility:include-filter" value="LightFuzzTest" />
- <option name="compatibility:include-filter" value="KernelLtpTest" />
+ <option name="compatibility:include-filter" value="KernelLtpStagingTest" />
<template-include name="reporters" default="basic-reporters" />
</configuration>
diff --git a/utils/python/mirror/hal_mirror.py b/utils/python/mirror/hal_mirror.py
index cd1e348..3829e9d 100644
--- a/utils/python/mirror/hal_mirror.py
+++ b/utils/python/mirror/hal_mirror.py
@@ -41,7 +41,8 @@
"mobile": 6,
"bluetooth": 7,
"nfc": 8,
- "bionic_libm": 1001}
+ "bionic_libm": 1001,
+ "vndk_libcutils": 1101}
VTS_CALLBACK_SERVER_TARGET_SIDE_PORT = 5010
diff --git a/utils/python/mirror/mirror_object.py b/utils/python/mirror/mirror_object.py
index 350ca33..952be04 100644
--- a/utils/python/mirror/mirror_object.py
+++ b/utils/python/mirror/mirror_object.py
@@ -193,8 +193,7 @@
# value_msg.type == "primitive_value"?
if isinstance(value_msg, int):
arg_msg.type = IfaceSpecMsg.TYPE_SCALAR
- arg_msg.scalar_value.int32_t = value_msg
- arg_msg.scalar_type = "int32_t"
+ setattr(arg_msg.scalar_value, arg_msg.scalar_type, value_msg)
elif isinstance(value_msg, float):
arg_msg.type = IfaceSpecMsg.TYPE_SCALAR
arg_msg.scalar_value.float_t = value_msg
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/README.md b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/README.md
new file mode 100644
index 0000000..c155e87
--- /dev/null
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/README.md
@@ -0,0 +1,18 @@
+# Running Webdriver tests for VTS-Dashboard
+
+## Setup
+
+1. Create a new Java Project in Eclipse with root directory :
+ /vts/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test
+
+2. Download Selenium Client & WebDriver Language Bindings from:
+ http://selenium-release.storage.googleapis.com/3.0-beta2/selenium-java-3.0.0-beta2.zip
+
+3. Extract it at some location and add the following files in the build path of the
+ project.
+ -- client-combined-3.0.0-beta2-nodeps.jar
+ -- Every jar in lib/ folder
+
+4. Compile the project and run the tests.
+
+
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java
index dd3207a..1b77c6a 100644
--- a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/test/src/com/google/android/vts/test/DashboardMainServletTest.java
@@ -31,13 +31,14 @@
private static final String ASSERT_MESSAGE = "Title should start differently.";
private static final String HOMEPAGE_TITLE = "VTS Dashboard";
private static final String LOGIN_BUTTON_ID = "submit-login";
- public static WebDriver driver = null;
+ private static WebDriver driver = null;
/**
* Runs once before running tests.
*/
@Override
public void setUp() {
+ System.setProperty("webdriver.chrome.driver", "chromedriver");
driver = new ChromeDriver();
}