| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package http2 |
| |
| import "testing" |
| |
| func TestInFlowTake(t *testing.T) { |
| var f inflow |
| f.init(100) |
| if !f.take(40) { |
| t.Fatalf("f.take(40) from 100: got false, want true") |
| } |
| if !f.take(40) { |
| t.Fatalf("f.take(40) from 60: got false, want true") |
| } |
| if f.take(40) { |
| t.Fatalf("f.take(40) from 20: got true, want false") |
| } |
| if !f.take(20) { |
| t.Fatalf("f.take(20) from 20: got false, want true") |
| } |
| } |
| |
| func TestInflowAddSmall(t *testing.T) { |
| var f inflow |
| f.init(0) |
| // Adding even a small amount when there is no flow causes an immediate send. |
| if got, want := f.add(1), int32(1); got != want { |
| t.Fatalf("f.add(1) to 1 = %v, want %v", got, want) |
| } |
| } |
| |
| func TestInflowAdd(t *testing.T) { |
| var f inflow |
| f.init(10 * inflowMinRefresh) |
| if got, want := f.add(inflowMinRefresh-1), int32(0); got != want { |
| t.Fatalf("f.add(minRefresh - 1) = %v, want %v", got, want) |
| } |
| if got, want := f.add(1), int32(inflowMinRefresh); got != want { |
| t.Fatalf("f.add(minRefresh) = %v, want %v", got, want) |
| } |
| } |
| |
| func TestTakeInflows(t *testing.T) { |
| var a, b inflow |
| a.init(10) |
| b.init(20) |
| if !takeInflows(&a, &b, 5) { |
| t.Fatalf("takeInflows(a, b, 5) from 10, 20: got false, want true") |
| } |
| if takeInflows(&a, &b, 6) { |
| t.Fatalf("takeInflows(a, b, 6) from 5, 15: got true, want false") |
| } |
| if !takeInflows(&a, &b, 5) { |
| t.Fatalf("takeInflows(a, b, 5) from 5, 15: got false, want true") |
| } |
| } |
| |
| func TestOutFlow(t *testing.T) { |
| var st outflow |
| var conn outflow |
| st.add(3) |
| conn.add(2) |
| |
| if got, want := st.available(), int32(3); got != want { |
| t.Errorf("available = %d; want %d", got, want) |
| } |
| st.setConnFlow(&conn) |
| if got, want := st.available(), int32(2); got != want { |
| t.Errorf("after parent setup, available = %d; want %d", got, want) |
| } |
| |
| st.take(2) |
| if got, want := conn.available(), int32(0); got != want { |
| t.Errorf("after taking 2, conn = %d; want %d", got, want) |
| } |
| if got, want := st.available(), int32(0); got != want { |
| t.Errorf("after taking 2, stream = %d; want %d", got, want) |
| } |
| } |
| |
| func TestOutFlowAdd(t *testing.T) { |
| var f outflow |
| if !f.add(1) { |
| t.Fatal("failed to add 1") |
| } |
| if !f.add(-1) { |
| t.Fatal("failed to add -1") |
| } |
| if got, want := f.available(), int32(0); got != want { |
| t.Fatalf("size = %d; want %d", got, want) |
| } |
| if !f.add(1<<31 - 1) { |
| t.Fatal("failed to add 2^31-1") |
| } |
| if got, want := f.available(), int32(1<<31-1); got != want { |
| t.Fatalf("size = %d; want %d", got, want) |
| } |
| if f.add(1) { |
| t.Fatal("adding 1 to max shouldn't be allowed") |
| } |
| } |
| |
| func TestOutFlowAddOverflow(t *testing.T) { |
| var f outflow |
| if !f.add(0) { |
| t.Fatal("failed to add 0") |
| } |
| if !f.add(-1) { |
| t.Fatal("failed to add -1") |
| } |
| if !f.add(0) { |
| t.Fatal("failed to add 0") |
| } |
| if !f.add(1) { |
| t.Fatal("failed to add 1") |
| } |
| if !f.add(1) { |
| t.Fatal("failed to add 1") |
| } |
| if !f.add(0) { |
| t.Fatal("failed to add 0") |
| } |
| if !f.add(-3) { |
| t.Fatal("failed to add -3") |
| } |
| if got, want := f.available(), int32(-2); got != want { |
| t.Fatalf("size = %d; want %d", got, want) |
| } |
| if !f.add(1<<31 - 1) { |
| t.Fatal("failed to add 2^31-1") |
| } |
| if got, want := f.available(), int32(1+-3+(1<<31-1)); got != want { |
| t.Fatalf("size = %d; want %d", got, want) |
| } |
| |
| } |