From e26b5d735d7e466dc8addc282b83e3cb853a25ce Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 23 Sep 2013 14:47:11 +0100 Subject: [PATCH 1/4] Close file after reading from it Added test to check number of open fds. --- ini.go | 1 + ini_test.go | 34 ++++++++++++++++++++++++++++++++++ test.ini | 2 ++ 3 files changed, 37 insertions(+) create mode 100644 test.ini diff --git a/ini.go b/ini.go index 867455f..81aeb32 100644 --- a/ini.go +++ b/ini.go @@ -64,6 +64,7 @@ func (f File) LoadFile(file string) (err error) { if err != nil { return } + defer in.Close() return f.Load(in) } diff --git a/ini_test.go b/ini_test.go index 06a4d05..7103347 100644 --- a/ini_test.go +++ b/ini_test.go @@ -4,6 +4,7 @@ import ( "reflect" "strings" "testing" + "syscall" ) func TestLoad(t *testing.T) { @@ -87,3 +88,36 @@ func TestDefinedSectionBehaviour(t *testing.T) { "a": {"this": "that"}, }) } + +func TestLoadFile(t *testing.T) { + originalOpenFiles := numFilesOpen() + + file, err := LoadFile("test.ini") + if err != nil { + t.Fatal(err) + } + + if originalOpenFiles != numFilesOpen() { + t.Error("test.ini not closed") + } + + if !reflect.DeepEqual(file, File{"default": {"stuff": "things"}}) { + t.Error("file not read correctly") + } +} + +func numFilesOpen() (num uint64) { + var rlimit syscall.Rlimit + syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit) + maxFds := int(rlimit.Cur) + + var stat syscall.Stat_t + for i := 0; i < maxFds; i++ { + if syscall.Fstat(i, &stat) == nil { + num++ + } else { + return + } + } + return +} diff --git a/test.ini b/test.ini new file mode 100644 index 0000000..d13c999 --- /dev/null +++ b/test.ini @@ -0,0 +1,2 @@ +[default] +stuff = things From c703dce83935209c4d77b1cb1490ecf7f55470aa Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 23 Sep 2013 14:54:46 +0100 Subject: [PATCH 2/4] Little gofmt issue --- ini_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ini_test.go b/ini_test.go index 7103347..b8bee27 100644 --- a/ini_test.go +++ b/ini_test.go @@ -3,8 +3,8 @@ package ini import ( "reflect" "strings" - "testing" "syscall" + "testing" ) func TestLoad(t *testing.T) { From 85f6018c4f519dad0009750b50b0e66279487e02 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 23 Sep 2013 15:00:58 +0100 Subject: [PATCH 3/4] Don't ignore Getrlimit error in test --- ini_test.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ini_test.go b/ini_test.go index b8bee27..f8ee4dd 100644 --- a/ini_test.go +++ b/ini_test.go @@ -90,14 +90,14 @@ func TestDefinedSectionBehaviour(t *testing.T) { } func TestLoadFile(t *testing.T) { - originalOpenFiles := numFilesOpen() + originalOpenFiles := numFilesOpen(t) file, err := LoadFile("test.ini") if err != nil { t.Fatal(err) } - if originalOpenFiles != numFilesOpen() { + if originalOpenFiles != numFilesOpen(t) { t.Error("test.ini not closed") } @@ -106,9 +106,12 @@ func TestLoadFile(t *testing.T) { } } -func numFilesOpen() (num uint64) { +func numFilesOpen(t *testing.T) (num uint64) { var rlimit syscall.Rlimit - syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit) + err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit) + if err != nil { + t.Fatal(err) + } maxFds := int(rlimit.Cur) var stat syscall.Stat_t From 3c405a41c29dda84ceb6abe9be85339143a465fc Mon Sep 17 00:00:00 2001 From: Vaughan Newton Date: Mon, 23 Sep 2013 16:51:27 +0200 Subject: [PATCH 4/4] Moved LoadFile test to a linux-only test file. --- ini_linux_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ ini_test.go | 37 ------------------------------------- 2 files changed, 43 insertions(+), 37 deletions(-) create mode 100644 ini_linux_test.go diff --git a/ini_linux_test.go b/ini_linux_test.go new file mode 100644 index 0000000..38a6f00 --- /dev/null +++ b/ini_linux_test.go @@ -0,0 +1,43 @@ +package ini + +import ( + "reflect" + "syscall" + "testing" +) + +func TestLoadFile(t *testing.T) { + originalOpenFiles := numFilesOpen(t) + + file, err := LoadFile("test.ini") + if err != nil { + t.Fatal(err) + } + + if originalOpenFiles != numFilesOpen(t) { + t.Error("test.ini not closed") + } + + if !reflect.DeepEqual(file, File{"default": {"stuff": "things"}}) { + t.Error("file not read correctly") + } +} + +func numFilesOpen(t *testing.T) (num uint64) { + var rlimit syscall.Rlimit + err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit) + if err != nil { + t.Fatal(err) + } + maxFds := int(rlimit.Cur) + + var stat syscall.Stat_t + for i := 0; i < maxFds; i++ { + if syscall.Fstat(i, &stat) == nil { + num++ + } else { + return + } + } + return +} diff --git a/ini_test.go b/ini_test.go index f8ee4dd..06a4d05 100644 --- a/ini_test.go +++ b/ini_test.go @@ -3,7 +3,6 @@ package ini import ( "reflect" "strings" - "syscall" "testing" ) @@ -88,39 +87,3 @@ func TestDefinedSectionBehaviour(t *testing.T) { "a": {"this": "that"}, }) } - -func TestLoadFile(t *testing.T) { - originalOpenFiles := numFilesOpen(t) - - file, err := LoadFile("test.ini") - if err != nil { - t.Fatal(err) - } - - if originalOpenFiles != numFilesOpen(t) { - t.Error("test.ini not closed") - } - - if !reflect.DeepEqual(file, File{"default": {"stuff": "things"}}) { - t.Error("file not read correctly") - } -} - -func numFilesOpen(t *testing.T) (num uint64) { - var rlimit syscall.Rlimit - err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit) - if err != nil { - t.Fatal(err) - } - maxFds := int(rlimit.Cur) - - var stat syscall.Stat_t - for i := 0; i < maxFds; i++ { - if syscall.Fstat(i, &stat) == nil { - num++ - } else { - return - } - } - return -}