1 // Copyright 2013 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.
5 #include "net/quic/port_suggester.h"
9 #include "base/basictypes.h"
10 #include "net/base/host_port_pair.h"
11 #include "testing/gtest/include/gtest/gtest.h"
16 class PortSuggesterTest
: public ::testing::Test
{
20 min_ephemeral_port_(1025),
21 max_ephemeral_port_(65535) {
25 int min_ephemeral_port_
;
26 int max_ephemeral_port_
;
29 TEST_F(PortSuggesterTest
, SmallRangeTest
) {
30 // When the range is small (one wide), we always get that as our answer.
31 scoped_refptr
<PortSuggester
> port_suggester
=
32 new PortSuggester(HostPortPair("www.example.com", 443), entropy_
);
33 // Test this for a few different (small) ranges.
34 for (int port
= 2000; port
< 2010; ++port
) {
35 // Use |port| for both |min| and |max| delimiting the suggestion range.
36 EXPECT_EQ(port
, port_suggester
->SuggestPort(port
, port
));
37 EXPECT_EQ(port
, port_suggester
->previous_suggestion());
41 TEST_F(PortSuggesterTest
, SuggestAllPorts
) {
42 // We should eventually fill out any range, but we'll just ensure that we
43 // fill out a small range of ports.
44 scoped_refptr
<PortSuggester
> port_suggester
=
45 new PortSuggester(HostPortPair("www.example.com", 443), entropy_
);
47 const uint32 port_range
= 20;
48 const int insertion_limit
= 200; // We should be done by then.
49 for (int i
= 0; i
< insertion_limit
; ++i
) {
50 ports
.insert(port_suggester
->SuggestPort(min_ephemeral_port_
,
51 min_ephemeral_port_
+ port_range
- 1));
52 if (ports
.size() == port_range
) {
56 EXPECT_EQ(port_range
, ports
.size());
59 TEST_F(PortSuggesterTest
, AvoidDuplication
) {
60 // When the range is large, duplicates are rare, but we'll ask for a few
61 // suggestions and make sure they are unique.
62 scoped_refptr
<PortSuggester
> port_suggester
=
63 new PortSuggester(HostPortPair("www.example.com", 80), entropy_
);
65 const size_t port_count
= 200;
66 for (size_t i
= 0; i
< port_count
; ++i
) {
67 ports
.insert(port_suggester
->SuggestPort(min_ephemeral_port_
,
68 max_ephemeral_port_
));
70 EXPECT_EQ(port_suggester
->call_count(), port_count
);
71 EXPECT_EQ(port_count
, ports
.size());
74 TEST_F(PortSuggesterTest
, ConsistentPorts
) {
75 // For given hostname, port, and entropy, we should always get the same
77 scoped_refptr
<PortSuggester
> port_suggester1
=
78 new PortSuggester(HostPortPair("www.example.com", 443), entropy_
);
79 scoped_refptr
<PortSuggester
> port_suggester2
=
80 new PortSuggester(HostPortPair("www.example.com", 443), entropy_
);
81 for (int test_count
= 20; test_count
> 0; --test_count
) {
82 EXPECT_EQ(port_suggester1
->SuggestPort(min_ephemeral_port_
,
84 port_suggester2
->SuggestPort(min_ephemeral_port_
,
85 min_ephemeral_port_
));
89 TEST_F(PortSuggesterTest
, DifferentHostPortEntropy
) {
90 // When we have different hosts, port, or entropy, we probably won't collide.
91 scoped_refptr
<PortSuggester
> port_suggester
[] = {
92 new PortSuggester(HostPortPair("www.example.com", 80), entropy_
),
93 new PortSuggester(HostPortPair("www.example.ORG", 80), entropy_
),
94 new PortSuggester(HostPortPair("www.example.com", 443), entropy_
),
95 new PortSuggester(HostPortPair("www.example.com", 80), entropy_
+ 123456),
99 const int port_count
= 40;
100 size_t insertion_count
= 0;
101 for (size_t j
= 0; j
< arraysize(port_suggester
); ++j
) {
102 for (int i
= 0; i
< port_count
; ++i
) {
103 ports
.insert(port_suggester
[j
]->SuggestPort(min_ephemeral_port_
,
104 max_ephemeral_port_
));
108 EXPECT_EQ(insertion_count
, ports
.size());