1 // Copyright 2015 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 <stdint.h>
6
7 #include <list>
8 #include <string>
9
10 #include "base/run_loop.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/stringprintf.h"
13 #include "media/base/media_switches.h"
14 #include "media/blink/url_index.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace media {
18
19 class UrlIndexTest : public testing::Test {
20 public:
UrlIndexTest()21 UrlIndexTest() : url_index_(nullptr) {}
22
GetByUrl(const GURL & gurl,UrlData::CorsMode cors_mode)23 scoped_refptr<UrlData> GetByUrl(const GURL& gurl,
24 UrlData::CorsMode cors_mode) {
25 scoped_refptr<UrlData> ret = url_index_.GetByUrl(gurl, cors_mode);
26 EXPECT_EQ(ret->url(), gurl);
27 EXPECT_EQ(ret->cors_mode(), cors_mode);
28 return ret;
29 }
30
31 UrlIndex url_index_;
32 };
33
TEST_F(UrlIndexTest,SimpleTest)34 TEST_F(UrlIndexTest, SimpleTest) {
35 GURL url1("http://foo.bar.com");
36 GURL url2("http://foo.bar.com/urgel");
37 scoped_refptr<UrlData> a = GetByUrl(url1, UrlData::CORS_UNSPECIFIED);
38 // Make sure it's valid, we still shouldn't get the same one.
39 a->Use();
40 a->set_range_supported();
41 EXPECT_TRUE(a->Valid());
42 EXPECT_EQ(a, url_index_.TryInsert(a));
43 scoped_refptr<UrlData> b = GetByUrl(url1, UrlData::CORS_ANONYMOUS);
44 b->Use();
45 b->set_range_supported();
46 EXPECT_TRUE(b->Valid());
47 EXPECT_EQ(b, url_index_.TryInsert(b));
48 scoped_refptr<UrlData> c = GetByUrl(url1, UrlData::CORS_USE_CREDENTIALS);
49 c->Use();
50 c->set_range_supported();
51 EXPECT_TRUE(c->Valid());
52 EXPECT_EQ(c, url_index_.TryInsert(c));
53 scoped_refptr<UrlData> d = GetByUrl(url2, UrlData::CORS_UNSPECIFIED);
54 d->Use();
55 d->set_range_supported();
56 EXPECT_TRUE(d->Valid());
57 EXPECT_EQ(d, url_index_.TryInsert(d));
58
59 EXPECT_NE(a, b);
60 EXPECT_NE(a, c);
61 EXPECT_NE(a, d);
62 EXPECT_NE(b, c);
63 EXPECT_NE(b, d);
64 EXPECT_NE(c, d);
65 EXPECT_EQ(a, GetByUrl(url1, UrlData::CORS_UNSPECIFIED));
66 EXPECT_EQ(b, GetByUrl(url1, UrlData::CORS_ANONYMOUS));
67 EXPECT_EQ(c, GetByUrl(url1, UrlData::CORS_USE_CREDENTIALS));
68 EXPECT_EQ(d, GetByUrl(url2, UrlData::CORS_UNSPECIFIED));
69 }
70
TEST_F(UrlIndexTest,UrlDataTest)71 TEST_F(UrlIndexTest, UrlDataTest) {
72 GURL url("http://foo.bar.com");
73 scoped_refptr<UrlData> a = GetByUrl(url, UrlData::CORS_UNSPECIFIED);
74
75 // Check default values.
76 EXPECT_FALSE(a->range_supported());
77 EXPECT_FALSE(a->cacheable());
78 EXPECT_EQ(a->length(), kPositionNotSpecified);
79 EXPECT_FALSE(a->Valid());
80
81 a->set_length(117);
82 EXPECT_EQ(a->length(), 117);
83
84 a->set_cacheable(true);
85 EXPECT_TRUE(a->cacheable());
86
87 base::Time now = base::Time::Now();
88 base::Time valid_until = now + base::TimeDelta::FromSeconds(500);
89 a->set_valid_until(valid_until);
90 a->set_range_supported();
91 EXPECT_EQ(valid_until, a->valid_until());
92 EXPECT_TRUE(a->Valid());
93
94 base::Time last_modified = now - base::TimeDelta::FromSeconds(500);
95 a->set_last_modified(last_modified);
96 EXPECT_EQ(last_modified, a->last_modified());
97 }
98
TEST_F(UrlIndexTest,UseTest)99 TEST_F(UrlIndexTest, UseTest) {
100 GURL url("http://foo.bar.com");
101 scoped_refptr<UrlData> a = GetByUrl(url, UrlData::CORS_UNSPECIFIED);
102 EXPECT_FALSE(a->Valid());
103 a->Use();
104 a->set_range_supported();
105 EXPECT_TRUE(a->Valid());
106 }
107
TEST_F(UrlIndexTest,TryInsert)108 TEST_F(UrlIndexTest, TryInsert) {
109 GURL url("http://foo.bar.com");
110 scoped_refptr<UrlData> a = GetByUrl(url, UrlData::CORS_UNSPECIFIED);
111 scoped_refptr<UrlData> c = GetByUrl(url, UrlData::CORS_UNSPECIFIED);
112 EXPECT_NE(a, c);
113 EXPECT_FALSE(a->Valid());
114 base::Time now = base::Time::Now();
115 base::Time last_modified = now - base::TimeDelta::FromSeconds(500);
116 base::Time valid_until = now + base::TimeDelta::FromSeconds(500);
117
118 // Not sharable yet. (no ranges)
119 EXPECT_EQ(a, url_index_.TryInsert(a));
120 EXPECT_NE(a, GetByUrl(url, UrlData::CORS_UNSPECIFIED));
121 a->set_last_modified(last_modified);
122
123 // Not sharable yet. (no ranges)
124 EXPECT_EQ(a, url_index_.TryInsert(a));
125 EXPECT_NE(a, GetByUrl(url, UrlData::CORS_UNSPECIFIED));
126
127 // Now we should be able to insert it into the index.
128 a->set_range_supported();
129 a->set_valid_until(valid_until);
130 EXPECT_TRUE(a->Valid());
131 EXPECT_EQ(a, url_index_.TryInsert(a));
132 EXPECT_EQ(a, GetByUrl(url, UrlData::CORS_UNSPECIFIED));
133
134 // |a| becomes expired...
135 a->set_valid_until(now - base::TimeDelta::FromSeconds(100));
136 EXPECT_FALSE(a->Valid());
137 scoped_refptr<UrlData> b = GetByUrl(url, UrlData::CORS_UNSPECIFIED);
138 EXPECT_NE(a, b);
139
140 b->set_range_supported();
141 b->set_valid_until(valid_until);
142 b->set_last_modified(last_modified);
143 EXPECT_TRUE(b->Valid());
144
145 EXPECT_EQ(b, url_index_.TryInsert(b));
146 EXPECT_EQ(b, GetByUrl(url, UrlData::CORS_UNSPECIFIED));
147
148 c->set_range_supported();
149 c->set_valid_until(valid_until);
150 c->set_last_modified(last_modified);
151 EXPECT_TRUE(c->Valid());
152
153 // B is still valid, so it should be preferred over C.
154 EXPECT_EQ(b, url_index_.TryInsert(c));
155 EXPECT_EQ(b, GetByUrl(url, UrlData::CORS_UNSPECIFIED));
156 }
157
158 } // namespace media
159