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