// 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) } }