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