/* * Copyright (C) 2011 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. */ #include #include #include "WVMDrmPlugin.h" #include "drm/DrmInfoRequest.h" #include "drm/DrmInfoStatus.h" #include "drm/DrmConstraints.h" #include "drm/DrmInfo.h" using namespace android; using namespace std; class WVMDrmPluginTest { public: WVMDrmPluginTest() {} ~WVMDrmPluginTest() {} void TestAsset(IDrmEngine *plugin, String8 &url); void TestRegister(IDrmEngine *plugin); void TestAcquireRights(IDrmEngine *plugin, String8 &url, int playbackMode); void TestCheckRightsNotAcquired(IDrmEngine *plugin, String8 &url); void TestCheckValidRights(IDrmEngine *plugin, String8 &url); void TestGetConstraints(IDrmEngine *plugin, String8 &url, int playbackMode); void TestRemoveRights(IDrmEngine *plugin, String8 &url); void TestRemoveAllRights(IDrmEngine *plugin); // Tests void Run(); private: static const int PlaybackMode_Default = 0; static const int PlaybackMode_Streaming = 1; static const int PlaybackMode_Offline = 2; static const int PlaybackMode_Any = PlaybackMode_Streaming | PlaybackMode_Offline; }; void WVMDrmPluginTest::Run() { cout << "WVDrmPluginTest::Run" << endl; const char *path = "/vendor/lib/drm/libdrmwvmplugin.so"; void *handle = dlopen(path, RTLD_NOW); if (handle == NULL) { fprintf(stderr, "Can't open plugin: %s %s\n", path, dlerror()); exit(-1); } typedef IDrmEngine *(*create_t)(); create_t creator = (create_t)dlsym(handle, "create"); if (!creator) { fprintf(stderr, "Can't find create method\n"); exit(-1); } typedef void (*destroy_t)(IDrmEngine *); destroy_t destroyer = (destroy_t)dlsym(handle, "destroy"); if (!destroyer) { fprintf(stderr, "Can't find destroy method\n"); exit(-1); } // Basic test - see if we can instantiate the object and call a method IDrmEngine *plugin = (*creator)(); if (plugin->initialize(0) != DRM_NO_ERROR) { fprintf(stderr, "onInitialize failed!\n"); exit(-1); } String8 url; // Remote asset url = String8("http://seawwws001.cdn.shibboleth.tv/videos/content/bbb_ffmpeg_hc_single_480p.wvm"); TestAsset(plugin, url); // Remote asset using widevine:// protocol url = String8("widevine://seawwws001.cdn.shibboleth.tv/videos/content/bbb_ffmpeg_hc_single_480p.wvm"); TestAsset(plugin, url); // Local asset url = String8("file:///sdcard/Widevine/inception_base_360p_single.wvm"); TestAsset(plugin, url); // Remote asset with query parameters url = String8("http://seawwws001.cdn.shibboleth.tv/videos/content/bbb_ffmpeg_hc_single_480p.wvm?a=b"); TestAsset(plugin, url); // Shut down and clean up if (plugin->terminate(0) != DRM_NO_ERROR) { fprintf(stderr, "onTerminate failed!\n"); exit(-1); } destroyer(plugin); dlclose(handle); printf("Test successful!\n"); exit(0); } void WVMDrmPluginTest::TestRegister(IDrmEngine *plugin) { cout << "WVDrmPluginTest::TestRegister" << endl; String8 mimeType("video/wvm"); DrmInfoRequest registrationInfo(DrmInfoRequest::TYPE_REGISTRATION_INFO, mimeType); registrationInfo.put(String8("WVPortalKey"), String8("OEM")); DrmInfo *info = plugin->acquireDrmInfo(0, ®istrationInfo); if (info == NULL) { fprintf(stderr, "acquireDrmInfo failed!\n"); exit(-1); } delete info; } void WVMDrmPluginTest::TestAcquireRights(IDrmEngine *plugin, String8 &url, int playbackMode) { cout << "WVDrmPluginTest::TestAcquireRights url=" << url << " mode=" << playbackMode << endl; String8 mimeType("video/wvm"); DrmInfoRequest rightsAcquisitionInfo(DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, mimeType); rightsAcquisitionInfo.put(String8("WVDRMServerKey"), String8( "https://staging.shibboleth.tv/widevine/cypherpc/cgi-bin/GetEMMs.cgi")); rightsAcquisitionInfo.put(String8("WVAssetURIKey"), url); rightsAcquisitionInfo.put(String8("WVDeviceIDKey"), String8("device1234")); rightsAcquisitionInfo.put(String8("WVPortalKey"), String8("OEM")); if (playbackMode) { char num[4]; sprintf(num, "%d", playbackMode); rightsAcquisitionInfo.put(String8("WVLicenseTypeKey"), String8(num)); cout << "WVLicenseTypeKey = " << num << endl; } DrmInfo *info = plugin->acquireDrmInfo(0, &rightsAcquisitionInfo); if (info == NULL) { fprintf(stderr, "acquireDrmInfo failed!\n"); exit(-1); } DrmInfoStatus *status = plugin->processDrmInfo(0, info); if (status == NULL || status->statusCode != DrmInfoStatus::STATUS_OK) { fprintf(stderr, "processDrmInfo failed!\n"); exit(-1); } delete status; delete info; } void WVMDrmPluginTest::TestCheckRightsNotAcquired(IDrmEngine *plugin, String8 &url) { cout << "WVDrmPluginTest::TestCheckRightsNotAcquired url=" << url << endl; if (plugin->checkRightsStatus(0, url, Action::DEFAULT) != RightsStatus::RIGHTS_NOT_ACQUIRED) { fprintf(stderr, "checkRightsNotAcquired default action failed!\n"); exit(-1); } if (plugin->checkRightsStatus(0, url, Action::PLAY) != RightsStatus::RIGHTS_NOT_ACQUIRED) { fprintf(stderr, "checkRightsNotAcquired failed!\n"); exit(-1); } } void WVMDrmPluginTest::TestCheckValidRights(IDrmEngine *plugin, String8 &url) { cout << "WVDrmPluginTest::TestCheckValidRights url=" << url << endl; if (plugin->checkRightsStatus(0, url, Action::DEFAULT) != RightsStatus::RIGHTS_VALID) { fprintf(stderr, "checkValidRights default action failed!\n"); exit(-1); } if (plugin->checkRightsStatus(0, url, Action::PLAY) != RightsStatus::RIGHTS_VALID) { fprintf(stderr, "checkValidRights play action failed!\n"); exit(-1); } } void WVMDrmPluginTest::TestGetConstraints(IDrmEngine *plugin, String8 &url, int playbackMode) { cout << "WVDrmPluginTest::TestGetConstraints url=" << url << endl; DrmConstraints *constraints; constraints = plugin->getConstraints(0, &url, Action::PLAY); if (constraints == NULL) { fprintf(stderr, "getConstraints returned NULL constraints!\n"); exit(-1); } if (constraints->getCount() != 6) { fprintf(stderr, "getConstraints returned unexpected count: %d!\n", constraints->getCount()); exit(-1); } if (constraints->get(DrmConstraints::LICENSE_START_TIME) == "") { fprintf(stderr, "getConstraints missing start time!\n"); exit(-1); } if (constraints->get(DrmConstraints::LICENSE_AVAILABLE_TIME) == "") { fprintf(stderr, "getConstraints missing available time!\n"); exit(-1); } if (constraints->get(DrmConstraints::LICENSE_EXPIRY_TIME) == "") { fprintf(stderr, "getConstraints missing expiry time!\n"); exit(-1); } if (constraints->get(String8("WVLicenseTypeKey")) == "") { fprintf(stderr, "getConstraints missing license type key!\n"); exit(-1); } if (constraints->get(String8("WVLicensedResolutionKey")) == "") { fprintf(stderr, "getConstraints missing resolution key!\n"); exit(-1); } if (constraints->get(String8("WVLastErrorKey")) == "") { fprintf(stderr, "getConstraints missing last error key!\n"); exit(-1); } String8 licenseTypeStr = constraints->get(String8("WVLicenseTypeKey")); int licenseType = atol(licenseTypeStr.string()); if (licenseType != playbackMode) { fprintf(stderr, "license type mismatch, expected %d, found %d\n", playbackMode, licenseType); exit(-1); } delete constraints; } void WVMDrmPluginTest::TestRemoveRights(IDrmEngine *plugin, String8 &url) { cout << "WVDrmPluginTest::TestRemoveRights url=" << url << endl; status_t status = plugin->removeRights(0, url); if (status != DRM_NO_ERROR) { fprintf(stderr, "removeRights returned error: %d!\n", (int)status); exit(-1); } } void WVMDrmPluginTest::TestRemoveAllRights(IDrmEngine *plugin) { cout << "WVDrmPluginTest::TestRemoveAllRights" << endl; status_t status = plugin->removeAllRights(0); if (status != DRM_NO_ERROR) { fprintf(stderr, "removeAllRights returned error: %d!\n", (int)status); exit(-1); } } void WVMDrmPluginTest::TestAsset(IDrmEngine *plugin, String8 &url) { cout << "WVDrmPluginTest::TestAsset url=" << url << endl; TestRegister(plugin); TestRemoveAllRights(plugin); TestCheckRightsNotAcquired(plugin, url); TestAcquireRights(plugin, url, PlaybackMode_Default); TestCheckValidRights(plugin, url); TestGetConstraints(plugin, url, PlaybackMode_Any); TestRemoveRights(plugin, url); TestCheckRightsNotAcquired(plugin, url); TestAcquireRights(plugin, url, PlaybackMode_Offline); TestCheckValidRights(plugin, url); TestGetConstraints(plugin, url, PlaybackMode_Offline); TestRemoveRights(plugin, url); TestCheckRightsNotAcquired(plugin, url); TestAcquireRights(plugin, url, PlaybackMode_Streaming); TestCheckValidRights(plugin, url); TestGetConstraints(plugin, url, PlaybackMode_Streaming); TestRemoveRights(plugin, url); TestCheckRightsNotAcquired(plugin, url); TestAcquireRights(plugin, url, PlaybackMode_Any); TestCheckValidRights(plugin, url); TestGetConstraints(plugin, url, PlaybackMode_Any); TestRemoveRights(plugin, url); TestCheckRightsNotAcquired(plugin, url); } int main(int argc, char **argv) { // turn off some noisy printing in WVStreamControl setenv("WV_SILENT", "true", 1); WVMDrmPluginTest test; test.Run(); }