1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "media_omx_hidl_master_test" 18 #ifdef __LP64__ 19 #define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 20 #endif 21 22 #include <android-base/logging.h> 23 24 #include <android/hardware/media/omx/1.0/IOmx.h> 25 #include <android/hardware/media/omx/1.0/IOmxNode.h> 26 #include <android/hardware/media/omx/1.0/IOmxObserver.h> 27 #include <android/hardware/media/omx/1.0/IOmxStore.h> 28 #include <android/hardware/media/omx/1.0/types.h> 29 #include <android/hidl/allocator/1.0/IAllocator.h> 30 #include <android/hidl/memory/1.0/IMapper.h> 31 #include <android/hidl/memory/1.0/IMemory.h> 32 33 using ::android::hardware::media::omx::V1_0::IOmx; 34 using ::android::hardware::media::omx::V1_0::IOmxObserver; 35 using ::android::hardware::media::omx::V1_0::IOmxNode; 36 using ::android::hardware::media::omx::V1_0::IOmxStore; 37 using ::android::hardware::media::omx::V1_0::Message; 38 using ::android::hardware::media::omx::V1_0::CodecBuffer; 39 using ::android::hardware::media::omx::V1_0::PortMode; 40 using ::android::hidl::allocator::V1_0::IAllocator; 41 using ::android::hidl::memory::V1_0::IMemory; 42 using ::android::hidl::memory::V1_0::IMapper; 43 using ::android::hardware::Return; 44 using ::android::hardware::Void; 45 using ::android::hardware::hidl_vec; 46 using ::android::hardware::hidl_string; 47 using ::android::sp; 48 49 #include <VtsHalHidlTargetTestBase.h> 50 #include <getopt.h> 51 #include <media_hidl_test_common.h> 52 53 // A class for test environment setup 54 class ComponentTestEnvironment : public ::testing::Environment { 55 public: 56 virtual void SetUp() {} 57 virtual void TearDown() {} 58 59 ComponentTestEnvironment() : instance("default") {} 60 61 void setInstance(const char* _instance) { instance = _instance; } 62 63 const hidl_string getInstance() const { return instance; } 64 65 int initFromOptions(int argc, char** argv) { 66 static struct option options[] = { 67 {"instance", required_argument, 0, 'I'}, {0, 0, 0, 0}}; 68 69 while (true) { 70 int index = 0; 71 int c = getopt_long(argc, argv, "I:", options, &index); 72 if (c == -1) { 73 break; 74 } 75 76 switch (c) { 77 case 'I': 78 setInstance(optarg); 79 break; 80 case '?': 81 break; 82 } 83 } 84 85 if (optind < argc) { 86 fprintf(stderr, 87 "unrecognized option: %s\n\n" 88 "usage: %s <gtest options> <test options>\n\n" 89 "test options are:\n\n" 90 "-I, --instance: HAL instance to test\n", 91 argv[optind ?: 1], argv[0]); 92 return 2; 93 } 94 return 0; 95 } 96 97 private: 98 hidl_string instance; 99 }; 100 101 static ComponentTestEnvironment* gEnv = nullptr; 102 103 class MasterHidlTest : public ::testing::VtsHalHidlTargetTestBase { 104 private: 105 typedef ::testing::VtsHalHidlTargetTestBase Super; 106 public: 107 virtual void SetUp() override { 108 Super::SetUp(); 109 omxStore = nullptr; 110 omxStore = Super::getService<IOmxStore>(); 111 ASSERT_NE(omxStore, nullptr); 112 omx = nullptr; 113 omx = omxStore->getOmx(gEnv->getInstance()); 114 ASSERT_NE(omx, nullptr); 115 } 116 117 virtual void TearDown() override { 118 Super::TearDown(); 119 } 120 121 sp<IOmxStore> omxStore; 122 sp<IOmx> omx; 123 124 protected: 125 static void description(const std::string& description) { 126 RecordProperty("description", description); 127 } 128 }; 129 130 void displayComponentInfo(hidl_vec<IOmx::ComponentInfo>& nodeList) { 131 for (size_t i = 0; i < nodeList.size(); i++) { 132 printf("%s | ", nodeList[i].mName.c_str()); 133 for (size_t j = 0; j < ((nodeList[i]).mRoles).size(); j++) { 134 printf("%s ", nodeList[i].mRoles[j].c_str()); 135 } 136 printf("\n"); 137 } 138 } 139 140 // list service attributes 141 TEST_F(MasterHidlTest, ListServiceAttr) { 142 description("list service attributes"); 143 android::hardware::media::omx::V1_0::Status status; 144 hidl_vec<IOmxStore::Attribute> attributes; 145 EXPECT_TRUE(omxStore 146 ->listServiceAttributes([&status, &attributes]( 147 android::hardware::media::omx::V1_0::Status _s, 148 hidl_vec<IOmxStore::Attribute> const& _nl) { 149 status = _s; 150 attributes = _nl; 151 }) 152 .isOk()); 153 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 154 if (attributes.size() == 0) ALOGV("Warning, Attribute list empty"); 155 } 156 157 // get node prefix 158 TEST_F(MasterHidlTest, getNodePrefix) { 159 description("get node prefix"); 160 hidl_string prefix; 161 omxStore->getNodePrefix( 162 [&prefix](hidl_string const& _nl) { prefix = _nl; }); 163 if (prefix.empty()) ALOGV("Warning, Node Prefix empty"); 164 } 165 166 // list roles 167 TEST_F(MasterHidlTest, ListRoles) { 168 description("list roles"); 169 hidl_vec<IOmxStore::RoleInfo> roleList; 170 omxStore->listRoles([&roleList](hidl_vec<IOmxStore::RoleInfo> const& _nl) { 171 roleList = _nl; 172 }); 173 if (roleList.size() == 0) ALOGV("Warning, RoleInfo list empty"); 174 } 175 176 // list components and roles. 177 TEST_F(MasterHidlTest, ListNodes) { 178 description("enumerate component and roles"); 179 android::hardware::media::omx::V1_0::Status status; 180 hidl_vec<IOmx::ComponentInfo> nodeList; 181 bool isPass = true; 182 EXPECT_TRUE( 183 omx->listNodes([&status, &nodeList]( 184 android::hardware::media::omx::V1_0::Status _s, 185 hidl_vec<IOmx::ComponentInfo> const& _nl) { 186 status = _s; 187 nodeList = _nl; 188 }) 189 .isOk()); 190 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 191 if (nodeList.size() == 0) 192 ALOGV("Warning, ComponentInfo list empty"); 193 else { 194 // displayComponentInfo(nodeList); 195 for (size_t i = 0; i < nodeList.size(); i++) { 196 sp<CodecObserver> observer = nullptr; 197 sp<IOmxNode> omxNode = nullptr; 198 observer = new CodecObserver(nullptr); 199 ASSERT_NE(observer, nullptr); 200 EXPECT_TRUE( 201 omx->allocateNode( 202 nodeList[i].mName, observer, 203 [&](android::hardware::media::omx::V1_0::Status _s, 204 sp<IOmxNode> const& _nl) { 205 status = _s; 206 omxNode = _nl; 207 }) 208 .isOk()); 209 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 210 if (omxNode == nullptr) { 211 isPass = false; 212 std::cerr << "[ !OK ] " << nodeList[i].mName.c_str() 213 << "\n"; 214 } else { 215 EXPECT_TRUE((omxNode->freeNode()).isOk()); 216 omxNode = nullptr; 217 // std::cout << "[ OK ] " << nodeList[i].mName.c_str() << 218 // "\n"; 219 } 220 } 221 } 222 EXPECT_TRUE(isPass); 223 } 224 225 int main(int argc, char** argv) { 226 gEnv = new ComponentTestEnvironment(); 227 ::testing::AddGlobalTestEnvironment(gEnv); 228 ::testing::InitGoogleTest(&argc, argv); 229 int status = gEnv->initFromOptions(argc, argv); 230 if (status == 0) { 231 status = RUN_ALL_TESTS(); 232 ALOGI("Test result = %d", status); 233 } 234 return status; 235 } 236