Skip to content

Commit

Permalink
make EventInfo implement private isDirer interface
Browse files Browse the repository at this point in the history
So it's possible to mock it in tests.
  • Loading branch information
rjeczalik committed Feb 22, 2015
1 parent bd2ef91 commit 7070909
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 47 deletions.
22 changes: 16 additions & 6 deletions event.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

package notify

import "strings"
import (
"fmt"
"strings"
)

// Event represents the type of filesystem action.
//
Expand Down Expand Up @@ -101,6 +104,18 @@ type EventInfo interface {
Sys() interface{} // underlying data source (can return nil)
}

type isDirer interface {
isDir() (bool, error)
}

var _ fmt.Stringer = (*event)(nil)
var _ isDirer = (*event)(nil)

// String implements fmt.Stringer interface.
func (e *event) String() string {
return e.Event().String() + `: "` + e.Path() + `"`
}

var estr = map[Event]string{
Create: "notify.Create",
Remove: "notify.Remove",
Expand All @@ -119,11 +134,6 @@ var estr = map[Event]string{
recursive: "recursive",
}

// String implements fmt.Stringer interface.
func (e *event) String() string {
return e.Event().String() + `: "` + e.Path() + `"`
}

// Kind gives generic event type of the EventInfo.Event(). The purpose is to
// hint the notify runtime whether the event created a file or directory or it
// deleted one. The possible values of Kind are Create or Remove, any other
Expand Down
14 changes: 4 additions & 10 deletions event_fsevents.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,7 @@ type event struct {
event Event
}

func (ei *event) Event() Event { return ei.event }
func (ei *event) Path() string { return ei.fse.Path }
func (ei *event) Sys() interface{} { return &ei.fse }

func isdir(ei EventInfo) (bool, error) {
if ei, ok := ei.(*event); ok {
return ei.fse.Flags&FSEventsIsDir != 0, nil
}
panic("invalid underlying type for the ErrorInfo interface")
}
func (ei *event) Event() Event { return ei.event }
func (ei *event) Path() string { return ei.fse.Path }
func (ei *event) Sys() interface{} { return &ei.fse }
func (ei *event) isDir() (bool, error) { return ei.fse.Flags&FSEventsIsDir != 0, nil }
23 changes: 5 additions & 18 deletions event_inotify.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@

package notify

import (
"os"
"syscall"
)
import "syscall"

// Platform independent event values.
const (
Expand Down Expand Up @@ -78,17 +75,7 @@ type event struct {
event Event
}

func (e *event) Event() Event { return e.event }
func (e *event) Path() string { return e.path }
func (e *event) Sys() interface{} { return &e.sys }

func isdir(ei EventInfo) (bool, error) {
if _, ok := ei.Sys().(syscall.InotifyEvent); ok {
return ei.Sys().(syscall.InotifyEvent).Mask&syscall.IN_ISDIR != 0, nil
}
fi, err := os.Stat(ei.Path())
if err != nil {
return false, err
}
return fi.IsDir(), nil
}
func (e *event) Event() Event { return e.event }
func (e *event) Path() string { return e.path }
func (e *event) Sys() interface{} { return &e.sys }
func (e *event) isDir() (bool, error) { return e.sys.Mask&syscall.IN_ISDIR != 0, nil }
4 changes: 1 addition & 3 deletions event_kqueue.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,7 @@ func (e *event) Path() string { return e.p }
// Sys returns platform specific object describing reported event.
func (e *event) Sys() interface{} { return &e.kq }

func isdir(ei EventInfo) (bool, error) {
return ei.Sys().(*Kevent).FI.IsDir(), nil
}
func (e *event) isDir() (bool, error) { return e.kq.FI.IsDir(), nil }

// Kevent represents a single event.
type Kevent struct {
Expand Down
8 changes: 4 additions & 4 deletions event_readdcw.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,11 @@ func (e *event) Event() Event { return e.e }
func (e *event) Path() string { return filepath.Join(syscall.UTF16ToString(e.pathw), e.name) }
func (e *event) Sys() interface{} { return e.ftype }

func isdir(ei EventInfo) (bool, error) {
if ftype, ok := ei.Sys().(uint8); ok && ftype != fTypeUnknown {
return ftype == fTypeDirectory, nil
func (e *event) isDir() (bool, error) {
if e.ftype != fTypeUnknown {
return e.ftype == fTypeDirectory, nil
}
fi, err := os.Stat(ei.Path())
fi, err := os.Stat(e.Path())
if err != nil {
return false, err
}
Expand Down
9 changes: 4 additions & 5 deletions event_stub.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ var ekind = map[Event]Event{}

type event struct{}

func (e *event) Event() (_ Event) { return }
func (e *event) Path() (_ string) { return }
func (e *event) Sys() (_ interface{}) { return }

func isdir(EventInfo) (_ bool, _ error) { return }
func (e *event) Event() (_ Event) { return }
func (e *event) Path() (_ string) { return }
func (e *event) Sys() (_ interface{}) { return }
func (e *event) isDir() (_ bool, _ error) { return }
6 changes: 5 additions & 1 deletion watcher_recursive_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,11 @@ func TestIsDirCreateEvent(t *testing.T) {
}

fn := func(i int, _ WCase, ei EventInfo) error {
switch ok, err := isdir(ei); {
d, ok := ei.(isDirer)
if !ok {
return fmt.Errorf("received EventInfo does not implement isDirer")
}
switch ok, err := d.isDir(); {
case err != nil:
return err
case ok != dirs[i]:
Expand Down

0 comments on commit 7070909

Please sign in to comment.