From fbacdc687f9f9f27de26658aa44d28e455d15ca9 Mon Sep 17 00:00:00 2001 From: Edwin Date: Thu, 7 Apr 2022 12:03:15 -0700 Subject: [PATCH] Add unit tests for AIDL service [ Merged from http://go/wvgerrit/150029 ] Test: m libwvdrmengine_hal_test -j128 Test: m libwvdrmengine_hal_test WV_UNITTESTS_BUILD_TARGET=hidl -j128 Test: adb push $(OUT)/data/nativetest/libwvdrmengine_hal_test /data/nativetest/. Test: adb shell LD_LIBRARY_PATH=/vendor/lib64 /data/nativetest/libwvdrmengine_hal_test Bug: 217247987 Change-Id: Ib4f22c976b8ae6c2983cb611a958ddc3a29aebdb --- libwvdrmengine/test/unit/Android.mk | 45 +++++- .../unit/WVCreatePluginFactories_hal_test.cpp | 28 ++++ .../test/unit/WVCryptoFactory_hal_test.cpp | 50 ++++++ .../test/unit/WVDrmFactory_hal_test.cpp | 142 ++++++++++++++++++ .../WVCreatePluginFactories_test.cpp | 0 .../unit/{ => hidl}/WVCryptoFactory_test.cpp | 0 .../unit/{ => hidl}/WVDrmFactory_test.cpp | 0 7 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 libwvdrmengine/test/unit/WVCreatePluginFactories_hal_test.cpp create mode 100644 libwvdrmengine/test/unit/WVCryptoFactory_hal_test.cpp create mode 100644 libwvdrmengine/test/unit/WVDrmFactory_hal_test.cpp rename libwvdrmengine/test/unit/{ => hidl}/WVCreatePluginFactories_test.cpp (100%) rename libwvdrmengine/test/unit/{ => hidl}/WVCryptoFactory_test.cpp (100%) rename libwvdrmengine/test/unit/{ => hidl}/WVDrmFactory_test.cpp (100%) diff --git a/libwvdrmengine/test/unit/Android.mk b/libwvdrmengine/test/unit/Android.mk index a07b784e..639e2922 100644 --- a/libwvdrmengine/test/unit/Android.mk +++ b/libwvdrmengine/test/unit/Android.mk @@ -5,10 +5,12 @@ LOCAL_PATH:= $(call my-dir) # include $(CLEAR_VARS) +WV_UNITTESTS_BUILD_TARGET?= +ifeq ($(WV_UNITTESTS_BUILD_TARGET), hidl) LOCAL_SRC_FILES := \ - WVCreatePluginFactories_test.cpp \ - WVCryptoFactory_test.cpp \ - WVDrmFactory_test.cpp \ + hidl/WVCreatePluginFactories_test.cpp \ + hidl/WVCryptoFactory_test.cpp \ + hidl/WVDrmFactory_test.cpp \ LOCAL_C_INCLUDES := \ frameworks/av/include \ @@ -40,7 +42,44 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_HEADER_LIBRARIES := \ libstagefright_foundation_headers \ +# build unit tests for Aidl +else + +LOCAL_SRC_FILES := \ + WVCreatePluginFactories_hal_test.cpp \ + WVCryptoFactory_hal_test.cpp \ + WVDrmFactory_hal_test.cpp \ + +LOCAL_C_INCLUDES := \ + frameworks/av/include \ + frameworks/native/include \ + vendor/widevine/libwvdrmengine/aidl_include \ + vendor/widevine/libwvdrmengine/include \ + vendor/widevine/libwvdrmengine/mediadrm/aidl_include \ + vendor/widevine/libwvdrmengine/oemcrypto/include \ + +LOCAL_STATIC_LIBRARIES := \ + libgtest \ + libgtest_main \ + +LOCAL_SHARED_LIBRARIES := \ + android.hardware.drm-V1-ndk \ + libbase \ + libbinder_ndk \ + libcrypto \ + libdl \ + liblog \ + libutils \ + libwvaidl \ + +LOCAL_HEADER_LIBRARIES := \ + libstagefright_foundation_headers \ + +# endif $(WV_UNITTESTS_BUILD_TARGET) +endif + LOCAL_MODULE := libwvdrmengine_hal_test + LOCAL_LICENSE_KINDS := legacy_by_exception_only LOCAL_LICENSE_CONDITIONS := by_exception_only diff --git a/libwvdrmengine/test/unit/WVCreatePluginFactories_hal_test.cpp b/libwvdrmengine/test/unit/WVCreatePluginFactories_hal_test.cpp new file mode 100644 index 00000000..ceaab7ad --- /dev/null +++ b/libwvdrmengine/test/unit/WVCreatePluginFactories_hal_test.cpp @@ -0,0 +1,28 @@ +// +// Copyright 2022 Google LLC. All Rights Reserved. This file and proprietary +// source code may only be used and distributed under the Widevine License +// Agreement. +// + +#include "WVCreatePluginFactories.h" +#include "gtest/gtest.h" + +namespace wvdrm { +namespace hardware { +namespace drm { +namespace widevine { + +using ::wvdrm::hardware::drm::widevine::WVDrmFactory; + +TEST(CreatePluginFactoriesTest, CreatesDrmFactory) { + std::shared_ptr drmFactory = + ::ndk::SharedRefBase::make(); + + EXPECT_NE((WVDrmFactory *)NULL, drmFactory.get()) + << "createDrmFactory() returned null"; +} + +} // namespace widevine +} // namespace drm +} // namespace hardware +} // namespace wvdrm diff --git a/libwvdrmengine/test/unit/WVCryptoFactory_hal_test.cpp b/libwvdrmengine/test/unit/WVCryptoFactory_hal_test.cpp new file mode 100644 index 00000000..db340c4a --- /dev/null +++ b/libwvdrmengine/test/unit/WVCryptoFactory_hal_test.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2022 Google LLC. All Rights Reserved. This file and proprietary + * source code may only be used and distributed under the Widevine License + * Agreement. + */ + +#include "WVDrmFactory.h" +#include "gtest/gtest.h" + +namespace wvdrm { +namespace hardware { +namespace drm { +namespace widevine { + +using ::aidl::android::hardware::drm::Uuid; +using ::wvdrm::hardware::drm::widevine::WVDrmFactory; + +const Uuid kWidevineUUID = {0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, + 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; + +const Uuid kOldNetflixWidevineUUID = {0x29, 0x70, 0x1F, 0xE4, 0x3C, 0xC7, + 0x4A, 0x34, 0x8C, 0x5B, 0xAE, 0x90, + 0xC7, 0x43, 0x9A, 0x47}; + +const Uuid kUnknownUUID = {0x6A, 0x7F, 0xAA, 0xB0, 0x83, 0xC7, 0x9E, 0x20, + 0x08, 0xBC, 0xEF, 0x32, 0x34, 0x1A, 0x9A, 0x26}; + +TEST(WVCryptoFactoryTest, SupportsSupportedCryptoSchemes) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + EXPECT_TRUE(factory->isCryptoSchemeSupported(kWidevineUUID)) + << "WVPluginFactory does not support Widevine's UUID"; + + EXPECT_TRUE(factory->isCryptoSchemeSupported(kOldNetflixWidevineUUID)) + << "WVPluginFactory does not support the old Netflix Widevine UUID"; +} + +TEST(WVCryptoFactoryTest, DoesNotSupportUnsupportedCryptoSchemes) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + EXPECT_FALSE(factory->isCryptoSchemeSupported(kUnknownUUID)) + << "WVPluginFactory incorrectly claims to support an unknown UUID"; +} + +} // namespace widevine +} // namespace drm +} // namespace hardware +} // namespace wvdrm diff --git a/libwvdrmengine/test/unit/WVDrmFactory_hal_test.cpp b/libwvdrmengine/test/unit/WVDrmFactory_hal_test.cpp new file mode 100644 index 00000000..87bb9574 --- /dev/null +++ b/libwvdrmengine/test/unit/WVDrmFactory_hal_test.cpp @@ -0,0 +1,142 @@ +/* + * Copyright 2022 Google LLC. All Rights Reserved. This file and proprietary + * source code may only be used and distributed under the Widevine License + * Agreement. + */ + +#include "WVDrmFactory.h" +#include "android-base/properties.h" +#include "cutils/properties.h" +#include "gtest/gtest.h" + +namespace wvdrm { +namespace hardware { +namespace drm { +namespace widevine { + +using ::aidl::android::hardware::drm::CryptoSchemes; +using ::aidl::android::hardware::drm::SecurityLevel; +using ::aidl::android::hardware::drm::SupportedContentType; +using ::aidl::android::hardware::drm::Uuid; +using ::wvdrm::hardware::drm::widevine::WVDrmFactory; + +const Uuid kWidevineUUID = {0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, + 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; + +const Uuid kOldNetflixWidevineUUID = {0x29, 0x70, 0x1F, 0xE4, 0x3C, 0xC7, + 0x4A, 0x34, 0x8C, 0x5B, 0xAE, 0x90, + 0xC7, 0x43, 0x9A, 0x47}; + +const Uuid kUnknownUUID = {0x6A, 0x7F, 0xAA, 0xB0, 0x83, 0xC7, 0x9E, 0x20, + 0x08, 0xBC, 0xEF, 0x32, 0x34, 0x1A, 0x9A, 0x26}; + +const std::vector supportedMimeTypes = { + "audio/mp4", "audio/webm", "cenc", "hls", "video/mp4", "video/webm", "webm", +}; + +const std::vector unSupportedMimeTypes = { + "application/x-mpegURL", "video/3gpp", + "video/x-flv", "video/MP2T", + "video/quicktime", "video/x-matroska", + "video/x-msvideo", "video/x-ms-wmv", +}; + +class WVDrmFactoryTestPeer : public WVDrmFactory { +public: + using WVDrmFactory::areSpoidsEnabled; + using WVDrmFactory::isBlankAppPackageNameAllowed; +}; + +TEST(WVDrmFactoryTest, SupportsSupportedCryptoSchemes) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + EXPECT_TRUE(factory->isCryptoSchemeSupported(kWidevineUUID)) + << "WVPluginFactory does not support Widevine's UUID"; + + EXPECT_TRUE(factory->isCryptoSchemeSupported(kOldNetflixWidevineUUID)) + << "WVPluginFactory does not support the old Netflix Widevine UUID"; +} + +TEST(WVDrmFactoryTest, DoesNotSupportUnsupportedCryptoSchemes) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + EXPECT_FALSE(factory->isCryptoSchemeSupported(kUnknownUUID)) + << "WVPluginFactory incorrectly claims to support an unknown UUID"; +} + +TEST(WVDrmFactoryTest, SupportsSupportedContainerFormats) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + CryptoSchemes schemes{}; + auto ret = factory->getSupportedCryptoSchemes(&schemes); + EXPECT_TRUE(ret.isOk()); + + for (auto mimeType : schemes.mimeTypes) { + std::string mime = mimeType.mime; + EXPECT_TRUE(std::find(supportedMimeTypes.begin(), supportedMimeTypes.end(), + mime) != supportedMimeTypes.end()) + << "WVPluginFactory does not support " << mime; + } +} + +TEST(WVDrmFactoryTest, DoesNotSupportUnsupportedContainerFormats) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + CryptoSchemes schemes{}; + auto ret = factory->getSupportedCryptoSchemes(&schemes); + EXPECT_TRUE(ret.isOk()); + + for (auto mimeType : schemes.mimeTypes) { + std::string mime = mimeType.mime; + EXPECT_FALSE(std::find(unSupportedMimeTypes.begin(), + unSupportedMimeTypes.end(), + mime) != unSupportedMimeTypes.end()) + << "WVPluginFactory incorrectly claims to support " << mime; + } +} + +TEST(WVDrmFactoryTest, CalculatesSpoidUseCorrectly) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + int32_t firstApiLevel = + android::base::GetIntProperty("ro.product.first_api_level", 0); + if (firstApiLevel == 0) { + // First API Level is 0 on factory->ROMs, but we can assume the current SDK + // version is the first if it's a factory->ROM. + firstApiLevel = + android::base::GetIntProperty("ro.build.version.sdk", 0); + } + bool shouldUseSpoids = (firstApiLevel >= 26); // Android O + + EXPECT_EQ(shouldUseSpoids, WVDrmFactoryTestPeer::areSpoidsEnabled()) + << "WVDrmFactory calculated a different SPOID state than expected."; +} + +TEST(WVDrmFactoryTest, CalculatesBlankAppPackageNamePermissibilityCorrectly) { + std::shared_ptr factory = + ::ndk::SharedRefBase::make(); + + int32_t firstApiLevel = + android::base::GetIntProperty("ro.product.first_api_level", 0); + if (firstApiLevel == 0) { + // First API Level is 0 on factory->ROMs, but we can assume the current SDK + // version is the first if it's a factory->ROM. + firstApiLevel = + android::base::GetIntProperty("ro.build.version.sdk", 0); + } + bool shouldAllow = (firstApiLevel < 29); // Android Q + + EXPECT_EQ(shouldAllow, WVDrmFactoryTestPeer::isBlankAppPackageNameAllowed()) + << "WVDrmFactory calculated a different Blank App Package Name state " + "than expected."; +} + +} // namespace widevine +} // namespace drm +} // namespace hardware +} // namespace wvdrm diff --git a/libwvdrmengine/test/unit/WVCreatePluginFactories_test.cpp b/libwvdrmengine/test/unit/hidl/WVCreatePluginFactories_test.cpp similarity index 100% rename from libwvdrmengine/test/unit/WVCreatePluginFactories_test.cpp rename to libwvdrmengine/test/unit/hidl/WVCreatePluginFactories_test.cpp diff --git a/libwvdrmengine/test/unit/WVCryptoFactory_test.cpp b/libwvdrmengine/test/unit/hidl/WVCryptoFactory_test.cpp similarity index 100% rename from libwvdrmengine/test/unit/WVCryptoFactory_test.cpp rename to libwvdrmengine/test/unit/hidl/WVCryptoFactory_test.cpp diff --git a/libwvdrmengine/test/unit/WVDrmFactory_test.cpp b/libwvdrmengine/test/unit/hidl/WVDrmFactory_test.cpp similarity index 100% rename from libwvdrmengine/test/unit/WVDrmFactory_test.cpp rename to libwvdrmengine/test/unit/hidl/WVDrmFactory_test.cpp