| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "net/spdy/http2_priority_dependencies.h" |
| |
| #include "testing/platform_test.h" |
| |
| namespace net { |
| |
| class HttpPriorityDependencyTest : public PlatformTest { |
| public: |
| HttpPriorityDependencyTest() : next_id_(0u) {} |
| |
| // Fixed priority values to use for testing. |
| enum { HIGHEST = 0, MEDIUM = 2, LOW = 4, LOWEST = 5 }; |
| |
| SpdyStreamId GetId() { return ++next_id_; } |
| |
| void TestStreamCreation(SpdyStreamId new_id, |
| SpdyPriority priority, |
| SpdyStreamId expected_dependent_id) { |
| SpdyStreamId dependent_id = 999u; |
| bool exclusive = false; |
| dependency_state.OnStreamSynSent(new_id, priority, &dependent_id, |
| &exclusive); |
| EXPECT_EQ(expected_dependent_id, dependent_id); |
| EXPECT_TRUE(exclusive); |
| } |
| |
| void OnStreamDestruction(SpdyStreamId id) { |
| dependency_state.OnStreamDestruction(id); |
| } |
| |
| private: |
| SpdyStreamId next_id_; |
| Http2PriorityDependencies dependency_state; |
| }; |
| |
| // Confirm dependencies correct for entries at the same priority. |
| TEST_F(HttpPriorityDependencyTest, SamePriority) { |
| Http2PriorityDependencies dependency_state; |
| |
| const SpdyStreamId first_id = GetId(); |
| const SpdyStreamId second_id = GetId(); |
| const SpdyStreamId third_id = GetId(); |
| |
| TestStreamCreation(first_id, MEDIUM, 0u); |
| TestStreamCreation(second_id, MEDIUM, first_id); |
| TestStreamCreation(third_id, MEDIUM, second_id); |
| } |
| |
| // Confirm dependencies correct for entries at different priorities, increasing. |
| TEST_F(HttpPriorityDependencyTest, DifferentPriorityIncreasing) { |
| Http2PriorityDependencies dependency_state; |
| |
| const SpdyStreamId first_id = GetId(); |
| const SpdyStreamId second_id = GetId(); |
| const SpdyStreamId third_id = GetId(); |
| |
| TestStreamCreation(first_id, LOWEST, 0u); |
| TestStreamCreation(second_id, MEDIUM, 0u); |
| TestStreamCreation(third_id, HIGHEST, 0u); |
| } |
| |
| // Confirm dependencies correct for entries at different priorities, increasing. |
| TEST_F(HttpPriorityDependencyTest, DifferentPriorityDecreasing) { |
| Http2PriorityDependencies dependency_state; |
| |
| const SpdyStreamId first_id = GetId(); |
| const SpdyStreamId second_id = GetId(); |
| const SpdyStreamId third_id = GetId(); |
| |
| TestStreamCreation(first_id, HIGHEST, 0u); |
| TestStreamCreation(second_id, MEDIUM, first_id); |
| TestStreamCreation(third_id, LOWEST, second_id); |
| } |
| |
| // Confirm dependencies correct if requests are completed between before |
| // next creation. |
| TEST_F(HttpPriorityDependencyTest, CompletionBeforeIssue) { |
| Http2PriorityDependencies dependency_state; |
| |
| const SpdyStreamId first_id = GetId(); |
| const SpdyStreamId second_id = GetId(); |
| const SpdyStreamId third_id = GetId(); |
| |
| TestStreamCreation(first_id, HIGHEST, 0u); |
| OnStreamDestruction(first_id); |
| TestStreamCreation(second_id, MEDIUM, 0u); |
| OnStreamDestruction(second_id); |
| TestStreamCreation(third_id, LOWEST, 0u); |
| } |
| |
| // Confirm dependencies correct if some requests are completed between before |
| // next creation. |
| TEST_F(HttpPriorityDependencyTest, SomeCompletions) { |
| Http2PriorityDependencies dependency_state; |
| |
| const SpdyStreamId first_id = GetId(); |
| const SpdyStreamId second_id = GetId(); |
| const SpdyStreamId third_id = GetId(); |
| |
| TestStreamCreation(first_id, HIGHEST, 0u); |
| TestStreamCreation(second_id, MEDIUM, first_id); |
| OnStreamDestruction(second_id); |
| TestStreamCreation(third_id, LOWEST, first_id); |
| } |
| |
| // A more complex example parallel to a simple web page. |
| TEST_F(HttpPriorityDependencyTest, Complex) { |
| Http2PriorityDependencies dependency_state; |
| |
| const SpdyStreamId first_id = GetId(); |
| const SpdyStreamId second_id = GetId(); |
| const SpdyStreamId third_id = GetId(); |
| const SpdyStreamId fourth_id = GetId(); |
| const SpdyStreamId fifth_id = GetId(); |
| const SpdyStreamId sixth_id = GetId(); |
| const SpdyStreamId seventh_id = GetId(); |
| const SpdyStreamId eighth_id = GetId(); |
| const SpdyStreamId nineth_id = GetId(); |
| const SpdyStreamId tenth_id = GetId(); |
| |
| TestStreamCreation(first_id, HIGHEST, 0u); |
| TestStreamCreation(second_id, MEDIUM, first_id); |
| TestStreamCreation(third_id, MEDIUM, second_id); |
| OnStreamDestruction(first_id); |
| TestStreamCreation(fourth_id, MEDIUM, third_id); |
| TestStreamCreation(fifth_id, LOWEST, fourth_id); |
| TestStreamCreation(sixth_id, MEDIUM, fourth_id); |
| OnStreamDestruction(third_id); |
| TestStreamCreation(seventh_id, MEDIUM, sixth_id); |
| TestStreamCreation(eighth_id, LOW, seventh_id); |
| OnStreamDestruction(second_id); |
| OnStreamDestruction(fourth_id); |
| OnStreamDestruction(fifth_id); |
| OnStreamDestruction(sixth_id); |
| OnStreamDestruction(seventh_id); |
| TestStreamCreation(nineth_id, MEDIUM, 0u); |
| TestStreamCreation(tenth_id, HIGHEST, 0u); |
| } |
| |
| } // namespace net |