16b74247fb
Some structures use int for sizes and UNIX timestamps. On some platforms, int is 32 bits, so this can lead to the year 2038 issues and overflows when dealing with large containers or layers. Consistently use int64 to store sizes and UNIX timestamps in api/types/types.go. Update related to code accordingly (i.e. strconv.FormatInt instead of strconv.Itoa). Use int64 in progressreader package to avoid integer overflow when dealing with large quantities. Update related code accordingly. Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
94 lines
1.7 KiB
Go
94 lines
1.7 KiB
Go
package progressreader
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"io"
|
|
"io/ioutil"
|
|
"testing"
|
|
|
|
"github.com/docker/docker/pkg/streamformatter"
|
|
)
|
|
|
|
func TestOutputOnPrematureClose(t *testing.T) {
|
|
var outBuf bytes.Buffer
|
|
content := []byte("TESTING")
|
|
reader := ioutil.NopCloser(bytes.NewReader(content))
|
|
writer := bufio.NewWriter(&outBuf)
|
|
|
|
prCfg := Config{
|
|
In: reader,
|
|
Out: writer,
|
|
Formatter: streamformatter.NewStreamFormatter(),
|
|
Size: int64(len(content)),
|
|
NewLines: true,
|
|
ID: "Test",
|
|
Action: "Read",
|
|
}
|
|
pr := New(prCfg)
|
|
|
|
part := make([]byte, 4, 4)
|
|
_, err := io.ReadFull(pr, part)
|
|
if err != nil {
|
|
pr.Close()
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := writer.Flush(); err != nil {
|
|
pr.Close()
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tlen := outBuf.Len()
|
|
pr.Close()
|
|
if err := writer.Flush(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if outBuf.Len() == tlen {
|
|
t.Fatalf("Expected some output when closing prematurely")
|
|
}
|
|
}
|
|
|
|
func TestCompleteSilently(t *testing.T) {
|
|
var outBuf bytes.Buffer
|
|
content := []byte("TESTING")
|
|
reader := ioutil.NopCloser(bytes.NewReader(content))
|
|
writer := bufio.NewWriter(&outBuf)
|
|
|
|
prCfg := Config{
|
|
In: reader,
|
|
Out: writer,
|
|
Formatter: streamformatter.NewStreamFormatter(),
|
|
Size: int64(len(content)),
|
|
NewLines: true,
|
|
ID: "Test",
|
|
Action: "Read",
|
|
}
|
|
pr := New(prCfg)
|
|
|
|
out, err := ioutil.ReadAll(pr)
|
|
if err != nil {
|
|
pr.Close()
|
|
t.Fatal(err)
|
|
}
|
|
if string(out) != "TESTING" {
|
|
pr.Close()
|
|
t.Fatalf("Unexpected output %q from reader", string(out))
|
|
}
|
|
|
|
if err := writer.Flush(); err != nil {
|
|
pr.Close()
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tlen := outBuf.Len()
|
|
pr.Close()
|
|
if err := writer.Flush(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if outBuf.Len() > tlen {
|
|
t.Fatalf("Should have closed silently when read is complete")
|
|
}
|
|
}
|