1527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M/*
2527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * Copyright (C) 2017 The Android Open Source Project
3527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M *
4527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * Licensed under the Apache License, Version 2.0 (the "License");
5527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * you may not use this file except in compliance with the License.
6527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * You may obtain a copy of the License at
7527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M *
8527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M *      http://www.apache.org/licenses/LICENSE-2.0
9527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M *
10527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * Unless required by applicable law or agreed to in writing, software
11527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * distributed under the License is distributed on an "AS IS" BASIS,
12527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * See the License for the specific language governing permissions and
14527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * limitations under the License.
15527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M */
16527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
17527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#define LOG_TAG "media_omx_hidl_component_test"
18527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android-base/logging.h>
19527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
20527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/IOmx.h>
21527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxNode.h>
22527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxObserver.h>
23527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/types.h>
24527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hidl/allocator/1.0/IAllocator.h>
25527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hidl/memory/1.0/IMapper.h>
26527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hidl/memory/1.0/IMemory.h>
27527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
28527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmx;
29527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxObserver;
30527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxNode;
31527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::Message;
32527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::CodecBuffer;
33ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::media::omx::V1_0::PortMode;
34527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hidl::allocator::V1_0::IAllocator;
35527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hidl::memory::V1_0::IMemory;
36527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hidl::memory::V1_0::IMapper;
37527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::Return;
38527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::Void;
39527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::hidl_vec;
40527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::hidl_string;
41527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::sp;
42527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
43527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <VtsHalHidlTargetTestBase.h>
44527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <getopt.h>
45527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <media_hidl_test_common.h>
46527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
47527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M// A class for test environment setup
48527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mclass ComponentTestEnvironment : public ::testing::Environment {
49527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M   public:
50527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    virtual void SetUp() {}
51527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    virtual void TearDown() {}
52527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
53527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ComponentTestEnvironment() : instance("default") {}
54527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
55527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    void setInstance(const char* _instance) { instance = _instance; }
56527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
57527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    void setComponent(const char* _component) { component = _component; }
58527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
59527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    void setRole(const char* _role) { role = _role; }
60527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
61527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    const hidl_string getInstance() const { return instance; }
62527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
63527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    const hidl_string getComponent() const { return component; }
64527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
65527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    const hidl_string getRole() const { return role; }
66527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
67527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    int initFromOptions(int argc, char** argv) {
68527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        static struct option options[] = {
69527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"instance", required_argument, 0, 'I'},
70527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"component", required_argument, 0, 'C'},
71527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"role", required_argument, 0, 'R'},
72527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {0, 0, 0, 0}};
73527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
74527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        while (true) {
75527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            int index = 0;
7623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            int c = getopt_long(argc, argv, "I:C:R:", options, &index);
77527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            if (c == -1) {
78527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                break;
79527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
80527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
81527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            switch (c) {
82527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                case 'I':
83527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    setInstance(optarg);
84527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    break;
85527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                case 'C':
86527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    setComponent(optarg);
87527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    break;
88527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                case 'R':
89527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    setRole(optarg);
90527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    break;
91527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                case '?':
92527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    break;
93527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
94527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
95527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
96527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (optind < argc) {
97527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            fprintf(stderr,
98527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    "unrecognized option: %s\n\n"
99527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    "usage: %s <gtest options> <test options>\n\n"
100527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    "test options are:\n\n"
101527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    "-I, --instance: HAL instance to test\n"
102527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    "-C, --component: OMX component to test\n"
10323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M                    "-R, --Role: OMX component Role\n",
104527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                    argv[optind ?: 1], argv[0]);
105527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            return 2;
106527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
107527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        return 0;
108527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
109527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
110527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M   private:
111527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    hidl_string instance;
112527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    hidl_string component;
113527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    hidl_string role;
114527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M};
115527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
116527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mstatic ComponentTestEnvironment* gEnv = nullptr;
117527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
11823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// generic component test fixture class
119527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mclass ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase {
120527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M   public:
121527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    virtual void SetUp() override {
122a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M        disableTest = false;
123527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        android::hardware::media::omx::V1_0::Status status;
124527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
125527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            gEnv->getInstance());
126527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_NE(omx, nullptr);
12723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        observer = new CodecObserver(nullptr);
128527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_NE(observer, nullptr);
129a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M        if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0)
130a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M            disableTest = true;
131527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_TRUE(omx->allocateNode(
132527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                           gEnv->getComponent(), observer,
133527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                           [&](android::hardware::media::omx::V1_0::Status _s,
134527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                               sp<IOmxNode> const& _nl) {
135527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                               status = _s;
136527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                               this->omxNode = _nl;
137527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                           })
138527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                        .isOk());
139527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_NE(omxNode, nullptr);
140527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role";
141527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        struct StringToClass {
142527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            const char* Class;
143527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            standardCompClass CompClass;
144527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        };
145527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        const StringToClass kStringToClass[] = {
146527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"audio_decoder", audio_decoder},
147527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"audio_encoder", audio_encoder},
148527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"video_decoder", video_decoder},
149527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            {"video_encoder", video_encoder},
150527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        };
151527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        const size_t kNumStringToClass =
152527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            sizeof(kStringToClass) / sizeof(kStringToClass[0]);
153527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        const char* pch;
154527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        char substring[OMX_MAX_STRINGNAME_SIZE];
155527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        strcpy(substring, gEnv->getRole().c_str());
156527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        pch = strchr(substring, '.');
157527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_NE(pch, nullptr) << "Invalid Component Role";
158527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        substring[pch - substring] = '\0';
159527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        compClass = unknown_class;
160527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        for (size_t i = 0; i < kNumStringToClass; ++i) {
161527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            if (!strcasecmp(substring, kStringToClass[i].Class)) {
162527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                compClass = kStringToClass[i].CompClass;
163527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                break;
164527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
165527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
166a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M        if (compClass == unknown_class) disableTest = true;
167f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        isSecure = false;
168f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        size_t suffixLen = strlen(".secure");
169f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        if (strlen(gEnv->getComponent().c_str()) >= suffixLen) {
170f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            isSecure =
171f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                !strcmp(gEnv->getComponent().c_str() +
172f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                            strlen(gEnv->getComponent().c_str()) - suffixLen,
173f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                        ".secure");
174f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        }
175a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M        if (disableTest) std::cerr << "[          ] Warning !  Test Disabled\n";
176527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
177527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
178527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    virtual void TearDown() override {
179527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (omxNode != nullptr) {
180527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            EXPECT_TRUE((omxNode->freeNode()).isOk());
181527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            omxNode = nullptr;
182527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
183527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
184527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
185527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    enum standardCompClass {
186527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        audio_decoder,
187527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        audio_encoder,
188527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        video_decoder,
189527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        video_encoder,
190527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        unknown_class,
191527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    };
192527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
193527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    sp<IOmx> omx;
194527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    sp<CodecObserver> observer;
195527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    sp<IOmxNode> omxNode;
196527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    standardCompClass compClass;
197f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    bool isSecure;
198a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    bool disableTest;
199f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M
200f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M   protected:
201f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    static void description(const std::string& description) {
202f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        RecordProperty("description", description);
203f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    }
204527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M};
205527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
206f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// Random Index used for monkey testing while get/set parameters
207527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#define RANDOM_INDEX 1729
208527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
209f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan Mvoid initPortMode(PortMode* pm, bool isSecure,
210f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                  ComponentHidlTest::standardCompClass compClass) {
211f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    pm[0] = PortMode::PRESET_BYTE_BUFFER;
212f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    pm[1] = PortMode::PRESET_BYTE_BUFFER;
213f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    if (isSecure) {
214f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        switch (compClass) {
215f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            case ComponentHidlTest::video_decoder:
216f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                pm[0] = PortMode::PRESET_SECURE_BUFFER;
217f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                break;
218f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            case ComponentHidlTest::video_encoder:
219f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                pm[1] = PortMode::PRESET_SECURE_BUFFER;
220f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                break;
221f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            default:
222f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                break;
223f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        }
224f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    }
225f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    return;
226f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M}
227f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
22823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// get/set video component port format
229527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MReturn<android::hardware::media::omx::V1_0::Status> setVideoPortFormat(
230527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    sp<IOmxNode> omxNode, OMX_U32 portIndex,
23123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat,
23223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    OMX_U32 xFramerate) {
233527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_U32 index = 0;
234527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat;
23523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    std::vector<OMX_COLOR_FORMATTYPE> arrColorFormat;
23623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    std::vector<OMX_VIDEO_CODINGTYPE> arrCompressionFormat;
237527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
238527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
239527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    while (1) {
240527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portFormat.nIndex = index;
241527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex,
242527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                              &portFormat);
243527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
24423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        if (eCompressionFormat == OMX_VIDEO_CodingUnused)
24523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            arrColorFormat.push_back(portFormat.eColorFormat);
246527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        else
24723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            arrCompressionFormat.push_back(portFormat.eCompressionFormat);
248527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        index++;
249527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (index == 512) {
250f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            // enumerated way too many formats, highly unusual for this to
251f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            // happen.
252527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            EXPECT_LE(index, 512U)
253527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                << "Expecting OMX_ErrorNoMore but not received";
254527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            break;
255527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
256527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
257527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (!index) return status;
25823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    if (eCompressionFormat == OMX_VIDEO_CodingUnused) {
25923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        for (index = 0; index < arrColorFormat.size(); index++) {
26023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            if (arrColorFormat[index] == eColorFormat) {
26123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M                portFormat.eColorFormat = arrColorFormat[index];
262527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                break;
263527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
264527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
26523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        if (index == arrColorFormat.size()) {
266a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M            ALOGE("setting default color format %x", (int)arrColorFormat[0]);
26723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            portFormat.eColorFormat = arrColorFormat[0];
268527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
269527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
270527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
27123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        for (index = 0; index < arrCompressionFormat.size(); index++) {
27223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            if (arrCompressionFormat[index] == eCompressionFormat) {
27323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M                portFormat.eCompressionFormat = arrCompressionFormat[index];
274527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                break;
275527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
276527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
27723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        if (index == arrCompressionFormat.size()) {
278a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M            ALOGE("setting default compression format %x",
279a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M                  (int)arrCompressionFormat[0]);
28023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            portFormat.eCompressionFormat = arrCompressionFormat[0];
281527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
282527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portFormat.eColorFormat = OMX_COLOR_FormatUnused;
283527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
284527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // In setParam call nIndex shall be ignored as per omx-il specification.
285527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // see how this holds up by corrupting nIndex
286527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    portFormat.nIndex = RANDOM_INDEX;
28723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    portFormat.xFramerate = xFramerate;
288527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex,
289527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                          &portFormat);
290527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    return status;
291527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
292527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
29323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// get/set audio component port format
294527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MReturn<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
29523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) {
296527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_U32 index = 0;
297527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat;
29823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    std::vector<OMX_AUDIO_CODINGTYPE> arrEncoding;
299527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
300527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
301527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    while (1) {
302527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portFormat.nIndex = index;
303527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex,
304527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                              &portFormat);
305527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
30623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        arrEncoding.push_back(portFormat.eEncoding);
307527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        index++;
308527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (index == 512) {
309f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            // enumerated way too many formats, highly unusual for this to
310f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            // happen.
311527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            EXPECT_LE(index, 512U)
312527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                << "Expecting OMX_ErrorNoMore but not received";
313527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            break;
314527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
315527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
316527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (!index) return status;
31723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    for (index = 0; index < arrEncoding.size(); index++) {
31823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        if (arrEncoding[index] == eEncoding) {
31923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            portFormat.eEncoding = arrEncoding[index];
320527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            break;
321527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
322527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
32323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    if (index == arrEncoding.size()) {
324a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M        ALOGE("setting default Port format %x", (int)arrEncoding[0]);
32523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        portFormat.eEncoding = arrEncoding[0];
326527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
327527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // In setParam call nIndex shall be ignored as per omx-il specification.
328527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // see how this holds up by corrupting nIndex
329527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    portFormat.nIndex = RANDOM_INDEX;
330527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex,
331527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                          &portFormat);
332527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    return status;
333527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
334527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
335a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// test dispatch message API call
336a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan MTEST_F(ComponentHidlTest, dispatchMsg) {
337a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    description("test dispatch message API call");
338a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
339a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
340a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    Message msgin, msgout;
341a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M
342a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    msgin.type = Message::Type::EVENT;
343f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    msgin.data.eventData.event = OMX_EventError;
344f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    msgin.data.eventData.data1 = 0xdeaf;
345f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    msgin.data.eventData.data2 = 0xd00d;
346f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    msgin.data.eventData.data3 = 0x01ce;
347f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    msgin.data.eventData.data4 = 0xfa11;
348a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    status = omxNode->dispatchMessage(msgin);
349a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
350a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    status = observer->dequeueMessage(&msgout, DEFAULT_TIMEOUT);
351f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
352f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(msgout.type, msgin.type);
353f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(msgout.data.eventData.event, msgin.data.eventData.event);
354f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(msgout.data.eventData.data1, msgin.data.eventData.data1);
355f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(msgout.data.eventData.data2, msgin.data.eventData.data2);
356f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(msgout.data.eventData.data3, msgin.data.eventData.data3);
357f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(msgout.data.eventData.data4, msgin.data.eventData.data4);
358a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M}
359a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M
36023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// set component role
361527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MTEST_F(ComponentHidlTest, SetRole) {
362f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test Set Component Role");
363a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
364527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
365527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
366f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
367527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
368527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
36923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port indices enumeration
3702aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_GetPortIndices) {
37123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    description("Test Component on Mandatory Port Parameters (Port Indices)");
372a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
373527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
374527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
375527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
376527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
377527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
378527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
379f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // Get Number of Ports and their Indices for all Domains
380f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // (Audio/Video/Image/Other)
381527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // All standard OMX components shall support following OMX Index types
382527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
383527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
384527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
385527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
386527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = getParam(omxNode, OMX_IndexParamImageInit, &params);
387527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
388527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = getParam(omxNode, OMX_IndexParamOtherInit, &params);
389527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
390527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
391527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
39223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port format enumeration
3932aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_EnumeratePortFormat) {
394f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test Component on Mandatory Port Parameters (Port Format)");
395a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
396527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
397527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
398527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
399527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
400527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
401527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
402527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
403527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
404527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
405527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
406527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
407527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
408527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
409527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        kPortIndexInput = params.nStartPortNumber;
410527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        kPortIndexOutput = kPortIndexInput + 1;
411527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
412527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
41323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
41423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    OMX_U32 xFramerate = 24U << 16;
415527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
416f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // Enumerate Port Format
417527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_encoder) {
418527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status =
419527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            setAudioPortFormat(omxNode, kPortIndexInput, OMX_AUDIO_CodingPCM);
420527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
421527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = setAudioPortFormat(omxNode, kPortIndexOutput,
422527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                    OMX_AUDIO_CodingAutoDetect);
423527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
424527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else if (compClass == audio_decoder) {
425527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = setAudioPortFormat(omxNode, kPortIndexInput,
426527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                    OMX_AUDIO_CodingAutoDetect);
427527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
428527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status =
429527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            setAudioPortFormat(omxNode, kPortIndexOutput, OMX_AUDIO_CodingPCM);
430527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
431527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else if (compClass == video_encoder) {
432527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status =
433527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            setVideoPortFormat(omxNode, kPortIndexInput, OMX_VIDEO_CodingUnused,
43423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M                               eColorFormat, xFramerate);
435527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
436527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = setVideoPortFormat(omxNode, kPortIndexOutput,
437527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                    OMX_VIDEO_CodingAutoDetect,
438527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                    OMX_COLOR_FormatUnused, 0U);
439527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
440527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
441527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = setVideoPortFormat(omxNode, kPortIndexInput,
442527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                    OMX_VIDEO_CodingAutoDetect,
443527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                    OMX_COLOR_FormatUnused, 0U);
444527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
44523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M        status = setVideoPortFormat(omxNode, kPortIndexOutput,
44623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M                                    OMX_VIDEO_CodingUnused, eColorFormat,
44723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M                                    xFramerate);
448527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
449527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
450527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
451527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
45223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// get/set default port settings of a component
4532aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) {
454f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description(
455f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        "Test Component on Mandatory Port Parameters (Port Definition)");
456a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
457527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
458527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
459527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
460527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
461527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
462527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
463527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
464527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
465527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
466527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
467527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
468527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
469527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
470527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        kPortIndexInput = params.nStartPortNumber;
471527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        kPortIndexOutput = kPortIndexInput + 1;
472527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
473527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
474f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    for (size_t i = kPortIndexInput; i < kPortIndexOutput; i++) {
475f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        OMX_PARAM_PORTDEFINITIONTYPE portDef;
476f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        status =
477f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
478f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
479f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        if (status == android::hardware::media::omx::V1_0::Status::OK) {
480f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_EQ(portDef.eDir, i - kPortIndexInput);  // OMX_DirInput
481f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_EQ(portDef.bEnabled, OMX_TRUE);
482f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_EQ(portDef.bPopulated, OMX_FALSE);
483f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_GE(portDef.nBufferCountMin, 1U);
484f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_GE(portDef.nBufferCountActual, portDef.nBufferCountMin);
485f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            if (compClass == audio_encoder || compClass == audio_decoder) {
486f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                EXPECT_EQ(portDef.eDomain, OMX_PortDomainAudio);
487f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            } else if (compClass == video_encoder ||
488f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                       compClass == video_decoder) {
489f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                EXPECT_EQ(portDef.eDomain, OMX_PortDomainVideo);
490527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
491f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            OMX_PARAM_PORTDEFINITIONTYPE mirror = portDef;
492f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
493f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            // nBufferCountActual >= nBufferCountMin
494f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef.nBufferCountActual = portDef.nBufferCountMin - 1;
495f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i,
496f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                  &portDef);
497f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_NE(status,
498f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                      ::android::hardware::media::omx::V1_0::Status::OK);
499f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
500f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            // Edit Read-Only fields.
501f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef = mirror;
502f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef.eDir = static_cast<OMX_DIRTYPE>(RANDOM_INDEX);
503f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
504f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
505f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_EQ(portDef.eDir, mirror.eDir);
506f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
507f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
508f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef = mirror;
509f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef.nBufferSize >>= 1;
510f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
511f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
512f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize);
513f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
514f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
515f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef = mirror;
516f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef.nBufferCountMin += 1;
517f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
518f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
519f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            EXPECT_EQ(portDef.nBufferCountMin, mirror.nBufferCountMin);
520f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
521f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
522f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef = mirror;
523f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef.nBufferCountActual += 1;
524f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i,
525f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                  &portDef);
526f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
527f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i,
528f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                      &portDef);
529f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                EXPECT_EQ(portDef.nBufferCountActual,
530f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                          mirror.nBufferCountActual + 1);
53123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            }
532527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
533f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef = mirror;
534f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            portDef.nBufferSize = mirror.nBufferSize << 1;
535f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i,
536f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                  &portDef);
537f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
538f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i,
539f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                      &portDef);
540f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                if (portDef.nBufferSize != mirror.nBufferSize) {
541f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                    std::cout
542f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                        << "[          ] Warning ! Component input port does "
543f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                           "not  preserve Read-Only fields \n";
544f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                }
54523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M            }
546527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
547527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
548527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
549527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
55023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// populate port test
5512aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_PopulatePort) {
552f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Verify bPopulated field of a component port");
553f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    if (disableTest || isSecure) return;
554527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
555f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    OMX_U32 portBase = 0;
556527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
557527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
558527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
559527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
560527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
561527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
562527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
563527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
564527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
565527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
566527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
567f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        portBase = params.nStartPortNumber;
568527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
569527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
570f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    sp<IAllocator> allocator = IAllocator::getService("ashmem");
571f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    EXPECT_NE(allocator.get(), nullptr);
572527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
573f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    OMX_PARAM_PORTDEFINITIONTYPE portDef;
574527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status =
575f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef);
576f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
577f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(portDef.bPopulated, OMX_FALSE);
578527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
579f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    android::Vector<BufferInfo> pBuffer;
580f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    pBuffer.clear();
581f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    uint32_t nBufferSize = portDef.nBufferSize >> 1;
582527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
583f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    for (size_t i = 0; i < portDef.nBufferCountActual; i++) {
584f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        BufferInfo buffer;
585f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        buffer.owner = client;
586f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM;
587f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        buffer.omxBuffer.attr.preset.rangeOffset = 0;
588f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        buffer.omxBuffer.attr.preset.rangeLength = 0;
589f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        bool success = false;
590f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        allocator->allocate(
591f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            nBufferSize,
592f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            [&success, &buffer](bool _s,
593f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                                ::android::hardware::hidl_memory const& mem) {
594f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                success = _s;
595f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                buffer.omxBuffer.sharedMemory = mem;
596f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            });
597f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        ASSERT_EQ(success, true);
598f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(), nBufferSize);
599527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
600f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        omxNode->useBuffer(
601f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            portBase, buffer.omxBuffer,
602f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            [&status, &buffer](android::hardware::media::omx::V1_0::Status _s,
603f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                               uint32_t id) {
604f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                status = _s;
605f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                buffer.id = id;
606f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M            });
607f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        pBuffer.push(buffer);
608f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
609f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    }
610527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
611527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status =
612f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef);
613f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
614f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // A port is populated when all of the buffers indicated by
61523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    // nBufferCountActual with a size of at least nBufferSizehave been
61623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    // allocated on the port.
617f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(portDef.bPopulated, OMX_FALSE);
618f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M}
619527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
62023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// Flush test
621f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(ComponentHidlTest, Flush) {
622f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test Flush");
623a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
624f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
625f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
626f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    Message msg;
627527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
628f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
629f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
630f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    OMX_PORT_PARAM_TYPE params;
631f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
632f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
633f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    } else {
634f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
635527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
636f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
637f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
638f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        kPortIndexInput = params.nStartPortNumber;
639f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        kPortIndexOutput = kPortIndexInput + 1;
640527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
641527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
642f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    android::Vector<BufferInfo> iBuffer, oBuffer;
643527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
644f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    // set port mode
645f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    PortMode portMode[2];
646f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    initPortMode(portMode, isSecure, compClass);
647f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
648f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
649f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
650f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
651f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
652f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to idle
653f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
654f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                            kPortIndexInput, kPortIndexOutput, portMode);
655f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to executing
656f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoExecute(omxNode, observer);
657f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // dispatch buffers
658f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    for (size_t i = 0; i < oBuffer.size(); i++) {
659f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]);
660527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
661f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // flush port
662f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
663f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M               kPortIndexOutput);
6642aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    // TODO: Sending empty input buffers is slightly tricky.
6652aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    // Components sometimes process input buffers even when output buffers are
6662aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    // not dispatched. For instance Parsing sequence header does not require
6672aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    // output buffers. In such instances sending 0 size input buffers might
6682aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    // make component to send error events. so lets skip this aspect of testing.
669f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // dispatch buffers
6702aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    for (size_t i = 0; i < iBuffer.size(); i++) {
6712aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //        dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]);
6722aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    }
6732aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    // flush ports
6742aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
6752aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //               kPortIndexOutput);
676f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to idle
677f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
678f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to loaded
679f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
680f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                            kPortIndexInput, kPortIndexOutput);
681f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M}
682527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
68323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// state transitions test
684f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(ComponentHidlTest, StateTransitions) {
68523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M    description("Test State Transitions Loaded<->Idle<->Execute");
686a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
687f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
688f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
689f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    Message msg;
690527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
691f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
692f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
693f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    OMX_PORT_PARAM_TYPE params;
694f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
695f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
696f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    } else {
697f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
698f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    }
699f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
700f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
701f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        kPortIndexInput = params.nStartPortNumber;
702f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        kPortIndexOutput = kPortIndexInput + 1;
703527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
704527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
705f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    android::Vector<BufferInfo> iBuffer, oBuffer;
706527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
707f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    // set port mode
708f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    PortMode portMode[2];
709f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    initPortMode(portMode, isSecure, compClass);
710f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
711f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
712f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
713f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
714f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
715f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to idle
716f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
717f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                            kPortIndexInput, kPortIndexOutput, portMode);
718f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to executing
719f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoExecute(omxNode, observer);
720f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // dispatch buffers
721f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    for (size_t i = 0; i < oBuffer.size(); i++) {
722f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]);
723527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
724f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to idle
725f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
7262aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    // set state to executing
7272aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    changeStateIdletoExecute(omxNode, observer);
7282aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    // TODO: Sending empty input buffers is slightly tricky.
7292aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    // dispatch buffers
7302aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    for (size_t i = 0; i < iBuffer.size(); i++) {
7312aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //        dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]);
7322aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    }
7332aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    // set state to idle
7342aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M    //    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
735f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to loaded
736f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
737f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                            kPortIndexInput, kPortIndexOutput);
738527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
739527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
74023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// state transitions test - monkeying
7412aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) {
742f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test State Transitions monkeying");
743f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    if (disableTest || isSecure) return;
744527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
745527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
746527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    Message msg;
747527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
748527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
749527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
750527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
751527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
752527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
753527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
754527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
755527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
756527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
757527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
758527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        kPortIndexInput = params.nStartPortNumber;
759527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        kPortIndexOutput = kPortIndexInput + 1;
760527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
761527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
762527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::Vector<BufferInfo> iBuffer, oBuffer;
763527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
764527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to loaded ; receive error OMX_ErrorSameState
765527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
766527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  OMX_StateLoaded);
767527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
768527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
769527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to executing ; receive error OMX_ErrorIncorrectStateTransition
770527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
771527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  OMX_StateExecuting);
772527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
773527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
774527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to idle
775f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
776f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                            kPortIndexInput, kPortIndexOutput);
777527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
778527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to idle ; receive error OMX_ErrorSameState
779527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
780527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  OMX_StateIdle);
781527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
782527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
783527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to executing
784f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoExecute(omxNode, observer);
785527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
786527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to executing ; receive error OMX_ErrorSameState
787527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
788527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  OMX_StateExecuting);
789527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
790527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
791527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to Loaded ; receive error OMX_ErrorIncorrectStateTransition
792527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
793527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  OMX_StateLoaded);
794527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
795527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
796527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to Idle
797f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
798527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
799527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // set state to Loaded
800f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
801f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                            kPortIndexInput, kPortIndexOutput);
802527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
803527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
80423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test
8052aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_PortEnableDisable_Loaded) {
806f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test Port Enable and Disable (Component State :: Loaded)");
807a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
808527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
809527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_U32 portBase = 0;
810527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    Message msg;
811527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
812527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
813527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
814527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
815527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
816527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
817527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
818527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
819527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
820527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
821527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portBase = params.nStartPortNumber;
822527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
823527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
824527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    for (size_t i = portBase; i < portBase + 2; i++) {
825527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status =
826527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i);
827527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
828527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
829527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
830527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(msg.type, Message::Type::EVENT);
831527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (msg.data.eventData.event == OMX_EventCmdComplete) {
832527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
833527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data2, i);
834527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // If you can disable a port, then you should be able to enable it
835527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // as well
836527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = omxNode->sendCommand(
837527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                toRawCommandType(OMX_CommandPortEnable), i);
838527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
839527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
840527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
841527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
842527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
843527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data2, i);
844527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else if (msg.data.eventData.event == OMX_EventError) {
845a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M            ALOGE("Port %d Disabling failed with error %d", (int)i,
846527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                  (int)msg.data.eventData.event);
847527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else {
848527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // something unexpected happened
849527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_TRUE(false);
850527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
851527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
852527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
853527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
85423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test
855527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MTEST_F(ComponentHidlTest, PortEnableDisable_Idle) {
856f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test Port Enable and Disable (Component State :: Idle)");
857a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
858527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
859527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
860527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_U32 portBase = 0;
861527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    Message msg;
862527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
863527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
864527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
865527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
866527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
867527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
868527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
869527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
870527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
871527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
872527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portBase = params.nStartPortNumber;
873527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
874527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    kPortIndexInput = portBase;
875527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    kPortIndexOutput = portBase + 1;
876527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
877527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // Component State :: Idle
878527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::Vector<BufferInfo> pBuffer[2];
879527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
880f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    // set port mode
881f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    PortMode portMode[2];
882f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    initPortMode(portMode, isSecure, compClass);
883f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
884f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
885f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
886f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
887f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
888f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to idle
889f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1],
890f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                            kPortIndexInput, kPortIndexOutput, portMode);
891527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
892527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    for (size_t i = portBase; i < portBase + 2; i++) {
893527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status =
894527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i);
895527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
896527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
897527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0],
898527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                          &pBuffer[1]);
899527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (status == android::hardware::media::omx::V1_0::Status::OK) {
900527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
901527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            if (msg.data.eventData.event == OMX_EventCmdComplete) {
902527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                // do not disable the port until all the buffers are freed
903527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                ASSERT_TRUE(false);
904527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            } else if (msg.data.eventData.event == OMX_EventError) {
905a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M                ALOGE("Port %d Disabling failed with error %d", (int)i,
906527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                      (int)msg.data.eventData.event);
907527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            } else {
908527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                // something unexpected happened
909527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                ASSERT_TRUE(false);
910527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
911527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else if (status ==
912527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                   android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
913527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            for (size_t j = 0; j < pBuffer[i - portBase].size(); ++j) {
914527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                status = omxNode->freeBuffer(i, pBuffer[i - portBase][j].id);
915527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                ASSERT_EQ(status,
916527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                          android::hardware::media::omx::V1_0::Status::OK);
917527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
918527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
919527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
920527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                              &pBuffer[0], &pBuffer[1]);
921527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
922527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
923527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
924527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
925527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data2, i);
926527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
927527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // If you can disable a port, then you should be able to enable it
928527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // as well
929527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = omxNode->sendCommand(
930527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                toRawCommandType(OMX_CommandPortEnable), i);
931527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
932527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
933527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // do not enable the port until all the buffers are supplied
934527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
935527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                              &pBuffer[0], &pBuffer[1]);
936527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status,
937527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                      android::hardware::media::omx::V1_0::Status::TIMED_OUT);
938527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
939f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            allocatePortBuffers(omxNode, &pBuffer[i - portBase], i,
940f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                portMode[i - portBase]);
941527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
942527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                              &pBuffer[0], &pBuffer[1]);
943527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
944527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
945527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
946527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data2, i);
947527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else {
948527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // something unexpected happened
949527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_TRUE(false);
950527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
951527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
952f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M
953f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to Loaded
954f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1],
955f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                            kPortIndexInput, kPortIndexOutput);
956527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
957527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
95823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test
959527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MTEST_F(ComponentHidlTest, PortEnableDisable_Execute) {
960f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description("Test Port Enable and Disable (Component State :: Execute)");
961a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M    if (disableTest) return;
962527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
963527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
964527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_U32 portBase = 0;
965527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    Message msg;
966527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
967527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
968527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
969527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
970527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
971527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
972527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
973527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
974527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
975527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
976527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portBase = params.nStartPortNumber;
977527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
978527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    kPortIndexInput = portBase;
979527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    kPortIndexOutput = portBase + 1;
980527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
981527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // Component State :: Idle
982527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::Vector<BufferInfo> pBuffer[2];
983527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
984f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    // set port mode
985f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    PortMode portMode[2];
986f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    initPortMode(portMode, isSecure, compClass);
987f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
988f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
989f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
990f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
991f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M
992f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to idle
993f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1],
994f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                            kPortIndexInput, kPortIndexOutput, portMode);
995527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
996f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to executing
997f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoExecute(omxNode, observer);
998527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
999f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // dispatch buffers
1000f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    for (size_t i = 0; i < pBuffer[1].size(); i++) {
1001f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M        dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]);
1002527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1003527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1004527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    for (size_t i = portBase; i < portBase + 2; i++) {
1005527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status =
1006527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i);
1007527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1008527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1009527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0],
1010527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                          &pBuffer[1]);
1011527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (status == android::hardware::media::omx::V1_0::Status::OK) {
1012527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
1013527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            if (msg.data.eventData.event == OMX_EventCmdComplete) {
1014527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                // do not disable the port until all the buffers are freed
1015527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                ASSERT_TRUE(false);
1016527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            } else if (msg.data.eventData.event == OMX_EventError) {
1017a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M                ALOGE("Port %d Disabling failed with error %d", (int)i,
1018527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                      (int)msg.data.eventData.event);
1019527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            } else {
1020527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                // something unexpected happened
1021527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                ASSERT_TRUE(false);
1022527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
1023527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else if (status ==
1024527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                   android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
1025527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            for (size_t j = 0; j < pBuffer[i - portBase].size(); ++j) {
1026527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                // test if client got all its buffers back
1027527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                EXPECT_EQ(pBuffer[i - portBase][j].owner, client);
1028527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                // free the buffers
1029527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                status = omxNode->freeBuffer(i, pBuffer[i - portBase][j].id);
1030527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                ASSERT_EQ(status,
1031527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                          android::hardware::media::omx::V1_0::Status::OK);
1032527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            }
1033527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1034527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1035527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                              &pBuffer[0], &pBuffer[1]);
1036527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1037527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
1038527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
1039527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
1040527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data2, i);
1041527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1042527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // If you can disable a port, then you should be able to enable it
1043527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // as well
1044527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = omxNode->sendCommand(
1045527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                toRawCommandType(OMX_CommandPortEnable), i);
1046527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1047527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1048527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // do not enable the port until all the buffers are supplied
1049527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1050527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                              &pBuffer[0], &pBuffer[1]);
1051527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status,
1052527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                      android::hardware::media::omx::V1_0::Status::TIMED_OUT);
1053527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1054f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M            allocatePortBuffers(omxNode, &pBuffer[i - portBase], i,
1055f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M                                portMode[i - portBase]);
1056527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1057527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                              &pBuffer[0], &pBuffer[1]);
1058527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1059527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.type, Message::Type::EVENT);
1060527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
1061527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data2, i);
1062527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else {
1063527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // something unexpected happened
1064527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_TRUE(false);
1065527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
1066527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1067f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M
1068f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to Idle
1069f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]);
1070f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M
1071f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    // set state to Loaded
1072f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1],
1073f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M                            kPortIndexInput, kPortIndexOutput);
1074527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
1075527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
107623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test - monkeying
10772aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_PortEnableDisable_M) {
1078f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M    description(
1079f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M        "Test Port Enable and Disable Monkeying (Component State :: Loaded)");
1080f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M    if (disableTest || isSecure) return;
1081527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    android::hardware::media::omx::V1_0::Status status;
1082527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_U32 portBase = 0;
1083527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    Message msg;
1084527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = setRole(omxNode, gEnv->getRole().c_str());
1085527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1086527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    OMX_PORT_PARAM_TYPE params;
1087527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (compClass == audio_decoder || compClass == audio_encoder) {
1088527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
1089527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    } else {
1090527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
1091527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1092527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
1093527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(params.nPorts, 2U);
1094527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        portBase = params.nStartPortNumber;
1095527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1096527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1097527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // disable invalid port, expecting OMX_ErrorBadPortIndex
1098527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable),
1099527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  RANDOM_INDEX);
1100527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
1101527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1102527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // enable invalid port, expecting OMX_ErrorBadPortIndex
1103527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortEnable),
1104527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                                  RANDOM_INDEX);
1105527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
1106527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1107527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // disable all ports
1108527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status =
1109527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), OMX_ALL);
1110527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1111527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    for (size_t i = 0; i < 2; i++) {
1112527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
1113527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1114527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(msg.type, Message::Type::EVENT);
1115527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (msg.data.eventData.event == OMX_EventCmdComplete) {
1116527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
1117527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            if (msg.data.eventData.data2 != portBase ||
1118527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                msg.data.eventData.data2 != portBase + 1)
1119527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                EXPECT_TRUE(false);
1120527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else if (msg.data.eventData.event == OMX_EventError) {
1121a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M            ALOGE("Port %d Disabling failed with error %d", (int)i,
1122527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                  (int)msg.data.eventData.event);
1123527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else {
1124527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // something unexpected happened
1125527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_TRUE(false);
1126527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
1127527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1128527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1129527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    // enable all ports
1130527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    status =
1131527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        omxNode->sendCommand(toRawCommandType(OMX_CommandPortEnable), OMX_ALL);
1132527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1133527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    for (size_t i = 0; i < 2; i++) {
1134527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
1135527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1136527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ASSERT_EQ(msg.type, Message::Type::EVENT);
1137527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        if (msg.data.eventData.event == OMX_EventCmdComplete) {
1138527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
1139527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            if (msg.data.eventData.data2 != portBase ||
1140527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                msg.data.eventData.data2 != portBase + 1)
1141527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                EXPECT_TRUE(false);
1142527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else if (msg.data.eventData.event == OMX_EventError) {
1143a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M            ALOGE("Port %d Enabling failed with error %d", (int)i,
1144527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M                  (int)msg.data.eventData.event);
1145527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        } else {
1146527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            // something unexpected happened
1147527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M            ASSERT_TRUE(false);
1148527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        }
1149527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1150527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
1151527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M
1152527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mint main(int argc, char** argv) {
1153527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    gEnv = new ComponentTestEnvironment();
1154527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ::testing::AddGlobalTestEnvironment(gEnv);
1155527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    ::testing::InitGoogleTest(&argc, argv);
1156527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    int status = gEnv->initFromOptions(argc, argv);
1157527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    if (status == 0) {
1158527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        status = RUN_ALL_TESTS();
1159527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M        ALOGI("Test result = %d", status);
1160527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    }
1161527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M    return status;
1162527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}
1163