1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/android/build_info.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/basictypes.h" 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/android/media_drm_bridge.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace media { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define EXPECT_TRUE_IF_AVAILABLE(a) \ 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) do { \ 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!MediaDrmBridge::IsAvailable()) { \ 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VLOG(0) << "MediaDrm not supported on device."; \ 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(a); \ 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { \ 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(a); \ 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } \ 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } while (0) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kAudioMp4[] = "audio/mp4"; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kVideoMp4[] = "video/mp4"; 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kAudioWebM[] = "audio/webm"; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kVideoWebM[] = "video/webm"; 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kInvalidKeySystem[] = "invalid.keysystem"; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const MediaDrmBridge::SecurityLevel kLNone = 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaDrmBridge::SECURITY_LEVEL_NONE; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const MediaDrmBridge::SecurityLevel kL1 = MediaDrmBridge::SECURITY_LEVEL_1; 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const MediaDrmBridge::SecurityLevel kL3 = MediaDrmBridge::SECURITY_LEVEL_3; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Helper functions to avoid typing "MediaDrmBridge::" in tests. 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic bool IsKeySystemSupported(const std::string& key_system) { 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return MediaDrmBridge::IsKeySystemSupported(key_system); 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static bool IsKeySystemSupportedWithType( 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& key_system, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& container_mime_type) { 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return MediaDrmBridge::IsKeySystemSupportedWithType(key_system, 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) container_mime_type); 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static bool IsSecurityLevelSupported( 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& key_system, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaDrmBridge::SecurityLevel security_level) { 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return MediaDrmBridge::IsSecurityLevelSupported(key_system, security_level); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(MediaDrmBridgeTest, IsSecurityLevelSupported_Widevine) { 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(IsSecurityLevelSupported(kWidevineKeySystem, kLNone)); 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We test "L3" fully. But for "L1" we don't check the result as it depends on 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // whether the test device supports "L1". 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE_IF_AVAILABLE(IsSecurityLevelSupported(kWidevineKeySystem, kL3)); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IsSecurityLevelSupported(kWidevineKeySystem, kL1); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Invalid keysytem is NOT supported regardless whether MediaDrm is available. 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(MediaDrmBridgeTest, IsSecurityLevelSupported_InvalidKeySystem) { 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kLNone)); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kL1)); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kL3)); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(MediaDrmBridgeTest, IsKeySystemSupported_Widevine) { 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE_IF_AVAILABLE(IsKeySystemSupported(kWidevineKeySystem)); 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(xhwang): Enable when b/13564917 is fixed. 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // EXPECT_TRUE_IF_AVAILABLE( 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioMp4)); 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE_IF_AVAILABLE( 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IsKeySystemSupportedWithType(kWidevineKeySystem, kVideoMp4)); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (base::android::BuildInfo::GetInstance()->sdk_int() <= 19) { 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioWebM)); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, kVideoWebM)); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioWebM)); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(IsKeySystemSupportedWithType(kWidevineKeySystem, kVideoWebM)); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "unknown")); 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "video/avi")); 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "audio/mp3")); 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Invalid keysytem is NOT supported regardless whether MediaDrm is available. 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(MediaDrmBridgeTest, IsKeySystemSupported_InvalidKeySystem) { 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupported(kInvalidKeySystem)); 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kAudioMp4)); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kVideoMp4)); 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kAudioWebM)); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kVideoWebM)); 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "unknown")); 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "video/avi")); 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "audio/mp3")); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace media 104