| 108 | } |
| 109 | |
| 110 | func TestFlowControl(t *testing.T) { |
| 111 | smallWindow := int64(10) |
| 112 | transport := newFakeTransport() |
| 113 | |
| 114 | reader := NewReader("1", smallWindow, transport) |
| 115 | writer := NewWriter("1", smallWindow, transport) |
| 116 | |
| 117 | go func() { |
| 118 | for dataPk := range transport.dataChan { |
| 119 | reader.RecvData(dataPk) |
| 120 | } |
| 121 | }() |
| 122 | |
| 123 | go func() { |
| 124 | for ackPk := range transport.ackChan { |
| 125 | writer.RecvAck(ackPk) |
| 126 | } |
| 127 | }() |
| 128 | |
| 129 | largeData := make([]byte, 100) |
| 130 | for i := range largeData { |
| 131 | largeData[i] = byte(i) |
| 132 | } |
| 133 | |
| 134 | writeDone := make(chan error) |
| 135 | go func() { |
| 136 | _, err := writer.Write(largeData) |
| 137 | writeDone <- err |
| 138 | }() |
| 139 | |
| 140 | received := make([]byte, 0, 100) |
| 141 | buf := make([]byte, 20) |
| 142 | for len(received) < len(largeData) { |
| 143 | n, err := reader.Read(buf) |
| 144 | if err != nil { |
| 145 | t.Fatalf("Read failed: %v", err) |
| 146 | } |
| 147 | received = append(received, buf[:n]...) |
| 148 | } |
| 149 | |
| 150 | select { |
| 151 | case err := <-writeDone: |
| 152 | if err != nil { |
| 153 | t.Fatalf("Write failed: %v", err) |
| 154 | } |
| 155 | case <-time.After(2 * time.Second): |
| 156 | t.Fatal("Write didn't complete in time") |
| 157 | } |
| 158 | |
| 159 | if !bytes.Equal(received, largeData) { |
| 160 | t.Fatal("Received data doesn't match sent data") |
| 161 | } |
| 162 | } |
| 163 | |
| 164 | func TestError(t *testing.T) { |
| 165 | transport := newFakeTransport() |