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