Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34365484 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "android.hardware.drm@1.4 vts" into sc-dev am: ac019db0

Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/interfaces/+/13482958

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I15d990d5d09e7e3998aa498a1d0ce1210422733a
parents 91829ae1 ac019db0
Loading
Loading
Loading
Loading

drm/1.4/vts/OWNERS

0 → 100644
+9 −0
Original line number Diff line number Diff line
conglin@google.com
edwinwong@google.com
fredgc@google.com
jtinker@google.com
juce@google.com
kylealexander@google.com
rfrias@google.com
robertshih@google.com
sigquit@google.com
+95 −0
Original line number Diff line number Diff line
//
// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

cc_library_static {
    name: "android.hardware.drm@1.4-vts",
    defaults: ["VtsHalTargetTestDefaults"],
    local_include_dirs: [
        "include",
    ],
    srcs: [
        "drm_hal_test.cpp",
    ],
    shared_libs: [
        "android.hardware.drm@1.0",
        "android.hardware.drm@1.1",
        "android.hardware.drm@1.2",
        "android.hardware.drm@1.3",
        "android.hardware.drm@1.4",
        "android.hidl.allocator@1.0",
        "android.hidl.memory@1.0",
        "libhidlmemory",
        "libnativehelper",
    ],
    static_libs: [
        "android.hardware.drm@1.0-helper",
        "android.hardware.drm@1.2-vts",
        "libdrmvtshelper",
    ],
    export_static_lib_headers: [
        "android.hardware.drm@1.2-vts",
    ],
    export_include_dirs: [
        "include",
    ],
}

cc_test {
    name: "VtsHalDrmV1_4TargetTest",
    defaults: ["VtsHalTargetTestDefaults"],
    include_dirs: ["hardware/interfaces/drm/1.0/vts/functional"],
    srcs: [
        "drm_hal_test_main.cpp",
    ],
    whole_static_libs: [
        "android.hardware.drm@1.4-vts",
    ],
    shared_libs: [
        "android.hardware.drm@1.0",
        "android.hardware.drm@1.1",
        "android.hardware.drm@1.2",
        "android.hardware.drm@1.3",
        "android.hardware.drm@1.4",
        "android.hidl.allocator@1.0",
        "android.hidl.memory@1.0",
        "libcrypto",
        "libhidlmemory",
        "libnativehelper",
    ],
    static_libs: [
        "android.hardware.drm@1.0-helper",
        "android.hardware.drm@1.2-vts",
        "libdrmvtshelper",
    ],
    arch: {
        arm: {
            data: [":libvtswidevine-arm-prebuilts"],
        },
        arm64: {
            data: [":libvtswidevine-arm64-prebuilts"],
        },
        x86: {
            data: [":libvtswidevine-x86-prebuilts"],
        },
        x86_64: {
            data: [":libvtswidevine-x86_64-prebuilts"],
        },
    },
    test_suites: [
        "general-tests",
        "vts",
    ],
}
+38 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<configuration description="Runs VtsHalDrmV1_4TargetTest.">
    <option name="test-suite-tag" value="apct" />
    <option name="test-suite-tag" value="apct-native" />
    <option name="not-shardable" value="true" />

    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>

    <target_preparer class="com.android.tradefed.targetprep.WifiPreparer" >
        <option name="verify-only" value="true" />
    </target_preparer>

    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
        <option name="cleanup" value="true" />
        <option name="push-file" key="VtsHalDrmV1_4TargetTest" value="/data/local/tmp/VtsHalDrmV1_4TargetTest" />
        <option name="push-file" key="libvtswidevine64.so" value="/data/local/tmp/64/lib/libvtswidevine.so" />
        <option name="push-file" key="libvtswidevine32.so" value="/data/local/tmp/32/lib/libvtswidevine.so" />
    </target_preparer>

    <test class="com.android.tradefed.testtype.GTest" >
        <option name="native-test-device-path" value="/data/local/tmp" />
        <option name="module-name" value="VtsHalDrmV1_4TargetTest" />
    </test>
</configuration>
+161 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "drm_hal_test@1.4"

#include "android/hardware/drm/1.4/vts/drm_hal_test.h"

namespace android {
namespace hardware {
namespace drm {
namespace V1_4 {
namespace vts {

const char* const DrmHalTest::kVideoMp4 = "video/mp4";
const char* const DrmHalTest::kAudioMp4 = "audio/mp4";
const uint32_t DrmHalTest::kSecLevelDefault = DrmHalTest::kSecLevelMax + 1;

sp<drm::V1_4::IDrmPlugin> DrmHalTest::DrmPluginV1_4() const {
    sp<drm::V1_4::IDrmPlugin> plugin(drm::V1_4::IDrmPlugin::castFrom(drmPlugin));
    EXPECT_NE(nullptr, plugin.get());
    return plugin;
}

sp<V1_0::ICryptoPlugin> DrmHalTest::CryptoPlugin(const SessionId& sid) {
    sp<V1_0::ICryptoPlugin> crypto;
    auto res = cryptoFactory->createPlugin(
        getUUID(), sid,
        [&](V1_0::Status status, const sp<V1_0::ICryptoPlugin>& plugin) {
            EXPECT_EQ(V1_0::Status::OK, status);
            EXPECT_NE(nullptr, plugin.get());
            crypto = plugin;
        });
    EXPECT_OK(res);
    return crypto;
}

SessionId DrmHalTest::OpenSession(uint32_t level = kSecLevelDefault) {
    V1_0::Status err;
    SessionId sessionId;
    bool attemptedProvision = false;

    V1_0::IDrmPlugin::openSession_cb cb = [&](
            V1_0::Status status,
            const hidl_vec<unsigned char> &id) {
        err = status;
        sessionId = id;
    };

    while (true) {
        Return<void> res;
        if (level > kSecLevelMax) {
            res = drmPlugin->openSession(cb);
        } else if (level >= kSecLevelMin) {
            auto securityLevel = static_cast<SecurityLevel>(level);
            res = drmPlugin->openSession_1_1(securityLevel, cb);
        }
        EXPECT_OK(res);
        if (V1_0::Status::ERROR_DRM_NOT_PROVISIONED == err
                && !attemptedProvision) {
            // provision once if necessary
            provision();
            attemptedProvision = true;
            continue;
        } else if (V1_0::Status::ERROR_DRM_CANNOT_HANDLE == err) {
            // must be able to handle default level
            EXPECT_NE(kSecLevelDefault, level);
            sessionId = {};
        } else {
            EXPECT_EQ(V1_0::Status::OK, err);
            EXPECT_NE(sessionId.size(), 0u);
        }
        break;
    }

    return sessionId;
}

TEST_P(DrmHalTest, RequiresSecureDecoder) {
    for (uint32_t level : {kSecLevelMin, kSecLevelMax, kSecLevelDefault}) {
        for (auto mime : {kVideoMp4, kAudioMp4}) {
            auto sid = OpenSession(level);
            if (sid.size() == 0u) {
                continue;
            }
            auto drm = DrmPluginV1_4();
            sp<V1_0::ICryptoPlugin> crypto(CryptoPlugin(sid));
            if (drm == nullptr || crypto == nullptr) {
                continue;
            }
            bool r1 = crypto->requiresSecureDecoderComponent(mime);
            bool r2;
            if (level == kSecLevelDefault) {
                r2 = drm->requiresSecureDecoderDefault(mime);
            } else {
                auto sL = static_cast<SecurityLevel>(level);
                r2 = drm->requiresSecureDecoder(mime, sL);
            }
            EXPECT_EQ(r1, r2);
            closeSession(sid);
        }
    }
}

TEST_P(DrmHalTest, SetPlaybackId) {
    auto testInfo = ::testing::UnitTest::GetInstance()->current_test_info();
    auto testName = testInfo->name();
    const hidl_string& pbId{testName};
    auto sid = OpenSession();
    auto drm = DrmPluginV1_4();
    if (drm == nullptr) {
        return;
    }
    V1_0::Status err = drm->setPlaybackId(sid, pbId);
    EXPECT_EQ(V1_0::Status::OK, err);
    closeSession(sid);

    // search for playback id among metric attributes/values
    bool foundPbId = false;
    auto res = drmPlugin->getMetrics([&](
            V1_0::Status status,
            hidl_vec<V1_1::DrmMetricGroup> metricGroups) {
        EXPECT_EQ(V1_0::Status::OK, status);
        for (const auto& group : metricGroups) {
            for (const auto& metric : group.metrics) {
                for (const auto& value : metric.values) {
                    if (value.stringValue == pbId) {
                        foundPbId = true;
                        break;
                    }
                }
                for (const auto& attr : metric.attributes) {
                    if (attr.stringValue == pbId) {
                        foundPbId = true;
                        break;
                    }
                }
            }
        }
    });
    EXPECT_OK(res);
    EXPECT_TRUE(foundPbId);
}

}  // namespace vts
}  // namespace V1_4
}  // namespace drm
}  // namespace hardware
}  // namespace android
+94 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Instantiate the set of test cases for each vendor module
 */

#define LOG_TAG "drm_hal_test@1.4"

#include <android/hardware/drm/1.4/ICryptoFactory.h>
#include <android/hardware/drm/1.4/IDrmFactory.h>
#include <gtest/gtest.h>
#include <hidl/HidlSupport.h>
#include <hidl/ServiceManagement.h>
#include <log/log.h>

#include <algorithm>
#include <iterator>
#include <string>
#include <utility>
#include <vector>

#include "android/hardware/drm/1.4/vts/drm_hal_test.h"

using drm_vts::DrmHalTestParam;
using drm_vts::PrintParamInstanceToString;

using android::hardware::drm::V1_4::vts::DrmHalTest;

static const std::vector<DrmHalTestParam> kAllInstances = [] {
    using ::android::hardware::hidl_array;
    using ::android::hardware::hidl_vec;
    using ::android::hardware::drm::V1_4::ICryptoFactory;
    using ::android::hardware::drm::V1_4::IDrmFactory;

    std::vector<std::string> drmInstances =
            android::hardware::getAllHalInstanceNames(IDrmFactory::descriptor);
    std::vector<std::string> cryptoInstances =
            android::hardware::getAllHalInstanceNames(ICryptoFactory::descriptor);
    std::set<std::string> allInstances;
    allInstances.insert(drmInstances.begin(), drmInstances.end());
    allInstances.insert(cryptoInstances.begin(), cryptoInstances.end());

    std::vector<DrmHalTestParam> firstInstanceUuidCombos;
    for (const auto &instance : allInstances) {
        auto drmFactory = IDrmFactory::getService(instance);
        if (drmFactory == nullptr) {
            continue;
        }
        drmFactory->getSupportedCryptoSchemes(
            [&](const hidl_vec<hidl_array<uint8_t, 16>>& schemes) {
                if (schemes.size() > 0) {
                    firstInstanceUuidCombos.push_back(DrmHalTestParam(instance, schemes[0]));
                }
            });
    }
    return firstInstanceUuidCombos;
}();

GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DrmHalTest);
INSTANTIATE_TEST_SUITE_P(PerInstance, DrmHalTest,
                         testing::ValuesIn(kAllInstances),
                         PrintParamInstanceToString);

int main(int argc, char** argv) {
#if defined(__LP64__)
    const char* kModulePath = "/data/local/tmp/64/lib";
#else
    const char* kModulePath = "/data/local/tmp/32/lib";
#endif
    DrmHalTest::gVendorModules
            = new drm_vts::VendorModules(kModulePath);
    if (DrmHalTest::gVendorModules->getPathList().size() == 0) {
        std::cerr << "WARNING: No vendor modules found in " << kModulePath <<
                ", all vendor tests will be skipped" << std::endl;
    }
    ::testing::InitGoogleTest(&argc, argv);
    int status = RUN_ALL_TESTS();
    ALOGI("Test result = %d", status);
    return status;
}
Loading