From 8bc345892efc282c5a295332b95d9d391f9ce700 Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Tue, 23 Apr 2019 17:41:01 -0700 Subject: [PATCH 1/8] initial commit --- pkg/mousemover/mouseMover.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/mousemover/mouseMover.go b/pkg/mousemover/mouseMover.go index 89389f3..28e9b9b 100644 --- a/pkg/mousemover/mouseMover.go +++ b/pkg/mousemover/mouseMover.go @@ -47,7 +47,10 @@ func (m *MouseMover) Start() { } heartbeatCh := activityTracker.Start() + run(heartbeatCh, m) +} +func run(heartbeatCh chan *tracker.Heartbeat, m *MouseMover) { go func(m *MouseMover) { logger := getLogger(m, false) //set writeToFile=true only for debugging m.updateRunningStatus(true) From bba12a2242663179c4cc92e9088c4b1750c973ce Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Fri, 26 Apr 2019 18:05:16 -0700 Subject: [PATCH 2/8] updating tests --- pkg/mousemover/mouseMover.go | 73 ++++--------------------------- pkg/mousemover/mouseMoverUtil.go | 64 +++++++++++++++++++++++++++ pkg/mousemover/mouseMover_test.go | 26 ++++++++--- 3 files changed, 94 insertions(+), 69 deletions(-) create mode 100644 pkg/mousemover/mouseMoverUtil.go diff --git a/pkg/mousemover/mouseMover.go b/pkg/mousemover/mouseMover.go index 28e9b9b..2270c31 100644 --- a/pkg/mousemover/mouseMover.go +++ b/pkg/mousemover/mouseMover.go @@ -6,9 +6,6 @@ import ( "sync" "time" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" - "github.com/go-vgo/robotgo" "github.com/prashantgupta24/activity-tracker/pkg/activity" "github.com/prashantgupta24/activity-tracker/pkg/tracker" @@ -27,7 +24,7 @@ type MouseMover struct { const ( timeout = 100 //ms logDir = "log" - logFileName = "logFile-amm-1" + logFileName = "logFile-amm-2" ) //Start the main app @@ -47,11 +44,14 @@ func (m *MouseMover) Start() { } heartbeatCh := activityTracker.Start() - run(heartbeatCh, m) + m.run(heartbeatCh, activityTracker) } -func run(heartbeatCh chan *tracker.Heartbeat, m *MouseMover) { - go func(m *MouseMover) { +func (m *MouseMover) run(heartbeatCh chan *tracker.Heartbeat, activityTracker *tracker.Instance) { + go func() { + if m.isRunning() { + return + } logger := getLogger(m, false) //set writeToFile=true only for debugging m.updateRunningStatus(true) movePixel := 10 @@ -91,7 +91,7 @@ func run(heartbeatCh chan *tracker.Heartbeat, m *MouseMover) { logger.Errorf("timeout happened after %vms while trying to move mouse", timeout) } } else { - logger.Infof("activity detected in the last %v seconds.", int(heartbeatInterval)) + logger.Infof("activity detected in the last %v seconds.", int(activityTracker.HeartbeatInterval)) logger.Infof("Activity type:\n") for activityType, times := range heartbeat.ActivityMap { logger.Infof("activityType : %v times: %v\n", activityType, len(times)) @@ -110,34 +110,7 @@ func run(heartbeatCh chan *tracker.Heartbeat, m *MouseMover) { return } } - }(m) -} - -func (m *MouseMover) isRunning() bool { - m.mutex.RLock() - defer m.mutex.RUnlock() - return m.runningStatus -} -func (m *MouseMover) updateRunningStatus(isRunning bool) { - m.mutex.Lock() - defer m.mutex.Unlock() - m.runningStatus = isRunning -} - -func moveAndCheck(movePixel int, mouseMoveSuccessCh chan bool) { - currentX, currentY := robotgo.GetMousePos() - moveToX := currentX + movePixel - moveToY := currentY + movePixel - robotgo.MoveMouse(moveToX, moveToY) - - //check if mouse moved. Sometimes mac users need to give - //extra permission for controlling the mouse - movedX, movedY := robotgo.GetMousePos() - if movedX == currentX && movedY == currentY { - mouseMoveSuccessCh <- false - } else { - mouseMoveSuccessCh <- true - } + }() } //Quit the app @@ -158,31 +131,3 @@ func GetInstance() *MouseMover { } return instance } - -func getLogger(m *MouseMover, doWriteToFile bool) *log.Logger { - logger := log.New() - logger.Formatter = &logrus.TextFormatter{ - FullTimestamp: true, - } - - if doWriteToFile { - _, err := os.Stat(logDir) - if err != nil { - if os.IsNotExist(err) { - err = os.Mkdir(logDir, os.ModePerm) - if err != nil { - log.Fatalf("error creating dir: %v", err) - } - } - } - - logFile, err := os.OpenFile(logDir+"/"+logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) - if err != nil { - log.Fatalf("error opening file: %v", err) - } - logger.SetOutput(logFile) - m.logFile = logFile - } - - return logger -} diff --git a/pkg/mousemover/mouseMoverUtil.go b/pkg/mousemover/mouseMoverUtil.go new file mode 100644 index 0000000..ecda123 --- /dev/null +++ b/pkg/mousemover/mouseMoverUtil.go @@ -0,0 +1,64 @@ +package mousemover + +import ( + "os" + + "github.com/go-vgo/robotgo" + "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" +) + +func getLogger(m *MouseMover, doWriteToFile bool) *log.Logger { + logger := log.New() + logger.Formatter = &logrus.TextFormatter{ + FullTimestamp: true, + } + + if doWriteToFile { + _, err := os.Stat(logDir) + if err != nil { + if os.IsNotExist(err) { + err = os.Mkdir(logDir, os.ModePerm) + if err != nil { + log.Fatalf("error creating dir: %v", err) + } + } + } + + logFile, err := os.OpenFile(logDir+"/"+logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("error opening file: %v", err) + } + logger.SetOutput(logFile) + m.logFile = logFile + } + + return logger +} + +func moveAndCheck(movePixel int, mouseMoveSuccessCh chan bool) { + currentX, currentY := robotgo.GetMousePos() + moveToX := currentX + movePixel + moveToY := currentY + movePixel + robotgo.MoveMouse(moveToX, moveToY) + + //check if mouse moved. Sometimes mac users need to give + //extra permission for controlling the mouse + movedX, movedY := robotgo.GetMousePos() + if movedX == currentX && movedY == currentY { + mouseMoveSuccessCh <- false + } else { + mouseMoveSuccessCh <- true + } +} + +func (m *MouseMover) isRunning() bool { + m.mutex.RLock() + defer m.mutex.RUnlock() + return m.runningStatus +} +func (m *MouseMover) updateRunningStatus(isRunning bool) { + m.mutex.Lock() + defer m.mutex.Unlock() + m.runningStatus = isRunning +} diff --git a/pkg/mousemover/mouseMover_test.go b/pkg/mousemover/mouseMover_test.go index 7b48d2b..cca5df5 100644 --- a/pkg/mousemover/mouseMover_test.go +++ b/pkg/mousemover/mouseMover_test.go @@ -6,15 +6,31 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" + + "github.com/prashantgupta24/activity-tracker/pkg/tracker" ) type TestMover struct { suite.Suite + activityTracker *tracker.Instance + heartbeatCh chan *tracker.Heartbeat } func TestSuite(t *testing.T) { suite.Run(t, new(TestMover)) } +//Run once before all tests +func (suite *TestMover) SetupSuite() { + heartbeatInterval := 60 + workerInterval := 10 + + suite.activityTracker = &tracker.Instance{ + HeartbeatInterval: heartbeatInterval, + WorkerInterval: workerInterval, + } + + suite.heartbeatCh= make(chan *tracker.Heartbeat) +} //Run once before each test func (suite *TestMover) SetupTest() { @@ -23,22 +39,22 @@ func (suite *TestMover) SetupTest() { func (suite *TestMover) TestSingleton() { t := suite.T() + mouseMover1 := GetInstance() - mouseMover1.Start() + mouseMover1.run(suite.heartbeatCh, suite.activityTracker) time.Sleep(time.Millisecond * 500) mouseMover2 := GetInstance() - assert.True(t, mouseMover2.isRunning(), "instance should not have started") + assert.True(t, mouseMover2.isRunning(), "instance should have started") } func (suite *TestMover) TestAppStartAndStop() { t := suite.T() mouseMover := GetInstance() - mouseMover.Start() + mouseMover.run(suite.heartbeatCh, suite.activityTracker) time.Sleep(time.Millisecond * 500) //wait for app to start assert.True(t, mouseMover.isRunning(), "app should have started") - mouseMover.Quit() - time.Sleep(time.Millisecond * 500) //wait for app to stop + time.Sleep(time.Millisecond * 1000) //wait for app to stop assert.False(t, mouseMover.isRunning(), "app should have stopped") } From a60d85577ac61b66873f30755d2b38c0c4e0691c Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Tue, 30 Apr 2019 18:53:53 -0700 Subject: [PATCH 3/8] added tests for app --- .gitignore | 6 +- Makefile | 12 +++- pkg/mousemover/mouseMover.go | 53 ++++++++--------- pkg/mousemover/mouseMoverUtil.go | 61 ++++++++++++++++--- pkg/mousemover/mouseMover_test.go | 98 +++++++++++++++++++++++++++---- pkg/mousemover/types.go | 29 +++++++++ 6 files changed, 207 insertions(+), 52 deletions(-) create mode 100644 pkg/mousemover/types.go diff --git a/.gitignore b/.gitignore index ade3b91..711de40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ vendor/ bin/ -log/ \ No newline at end of file +log/ + +# coverage +*.html +*.out \ No newline at end of file diff --git a/Makefile b/Makefile index dacc7dc..faf08c0 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +COVER_PROFILE=cover.out +COVER_HTML=cover.html + all: open build: clean @@ -16,8 +19,13 @@ clean: start: go run cmd/main.go -test: - go test -v -race -failfast ./... +coverage: $(COVER_HTML) + +$(COVER_HTML): $(COVER_PROFILE) + go tool cover -html=$(COVER_PROFILE) -o $(COVER_HTML) + +$(COVER_PROFILE): + go test -v -failfast -race -coverprofile=$(COVER_PROFILE) ./... vet: go vet $(shell glide nv) diff --git a/pkg/mousemover/mouseMover.go b/pkg/mousemover/mouseMover.go index 2270c31..db6461e 100644 --- a/pkg/mousemover/mouseMover.go +++ b/pkg/mousemover/mouseMover.go @@ -2,8 +2,6 @@ package mousemover import ( "fmt" - "os" - "sync" "time" "github.com/go-vgo/robotgo" @@ -13,14 +11,6 @@ import ( var instance *MouseMover -//MouseMover is the main struct for the app -type MouseMover struct { - quit chan struct{} - mutex sync.RWMutex - runningStatus bool - logFile *os.File -} - const ( timeout = 100 //ms logDir = "log" @@ -29,9 +19,10 @@ const ( //Start the main app func (m *MouseMover) Start() { - if m.isRunning() { + if m.state.isRunning() { return } + m.state = &state{} m.quit = make(chan struct{}) heartbeatInterval := 60 //value always in seconds @@ -49,38 +40,40 @@ func (m *MouseMover) Start() { func (m *MouseMover) run(heartbeatCh chan *tracker.Heartbeat, activityTracker *tracker.Instance) { go func() { - if m.isRunning() { + state := m.state + if state != nil && state.isRunning() { return } + state.updateRunningStatus(true) + logger := getLogger(m, false) //set writeToFile=true only for debugging - m.updateRunningStatus(true) movePixel := 10 - var lastMoved time.Time - isSystemSleeping := false - didNotMoveTimes := 0 + // var lastMoved time.Time + // didNotMoveTimes := 0 for { select { case heartbeat := <-heartbeatCh: if !heartbeat.WasAnyActivity { - if isSystemSleeping { + if state.isSystemSleeping() { logger.Infof("system sleeping") continue } mouseMoveSuccessCh := make(chan bool) - go moveAndCheck(movePixel, mouseMoveSuccessCh) + go moveAndCheck(state, movePixel, mouseMoveSuccessCh) select { case wasMouseMoveSuccess := <-mouseMoveSuccessCh: if wasMouseMoveSuccess { - lastMoved = time.Now() - logger.Infof("moved mouse at : %v\n\n", lastMoved) + state.updateLastMouseMovedTime(time.Now()) + logger.Infof("moved mouse at : %v\n\n", state.getLastMouseMovedTime()) movePixel *= -1 - didNotMoveTimes = 0 + state.updateDidNotMoveCount(0) } else { - didNotMoveTimes++ + didNotMoveCount := state.getDidNotMoveCount() + state.updateDidNotMoveCount(didNotMoveCount + 1) msg := fmt.Sprintf("Mouse pointer cannot be moved at %v. Last moved at %v. Happened %v times. See README for details.", - time.Now(), lastMoved, didNotMoveTimes) + time.Now(), state.getLastMouseMovedTime(), state.getDidNotMoveCount()) logger.Errorf(msg) - if didNotMoveTimes >= 3 { + if state.getDidNotMoveCount() >= 3 { go func() { robotgo.ShowAlert("Error with Automatic Mouse Mover", msg) }() @@ -96,16 +89,16 @@ func (m *MouseMover) run(heartbeatCh chan *tracker.Heartbeat, activityTracker *t for activityType, times := range heartbeat.ActivityMap { logger.Infof("activityType : %v times: %v\n", activityType, len(times)) if activityType == activity.MachineSleep { - isSystemSleeping = true + state.updateMachineSleepStatus(true) } else if activityType == activity.MachineWake { - isSystemSleeping = false + state.updateMachineSleepStatus(false) } } logger.Infof("\n\n\n") } case <-m.quit: logger.Infof("stopping mouse mover") - m.updateRunningStatus(false) + state.updateRunningStatus(false) activityTracker.Quit() return } @@ -116,7 +109,7 @@ func (m *MouseMover) run(heartbeatCh chan *tracker.Heartbeat, activityTracker *t //Quit the app func (m *MouseMover) Quit() { //making it idempotent - if m != nil && m.isRunning() { + if m != nil && m.state.isRunning() { m.quit <- struct{}{} } if m.logFile != nil { @@ -127,7 +120,9 @@ func (m *MouseMover) Quit() { //GetInstance gets the singleton instance for mouse mover app func GetInstance() *MouseMover { if instance == nil { - instance = &MouseMover{} + instance = &MouseMover{ + state: &state{}, + } } return instance } diff --git a/pkg/mousemover/mouseMoverUtil.go b/pkg/mousemover/mouseMoverUtil.go index ecda123..b686a69 100644 --- a/pkg/mousemover/mouseMoverUtil.go +++ b/pkg/mousemover/mouseMoverUtil.go @@ -2,6 +2,7 @@ package mousemover import ( "os" + "time" "github.com/go-vgo/robotgo" "github.com/sirupsen/logrus" @@ -36,7 +37,11 @@ func getLogger(m *MouseMover, doWriteToFile bool) *log.Logger { return logger } -func moveAndCheck(movePixel int, mouseMoveSuccessCh chan bool) { +func moveAndCheck(state *state, movePixel int, mouseMoveSuccessCh chan bool) { + if state.override != nil { //we don't want to move mouse for tests + mouseMoveSuccessCh <- state.override.valueToReturn + return + } currentX, currentY := robotgo.GetMousePos() moveToX := currentX + movePixel moveToY := currentY + movePixel @@ -52,13 +57,51 @@ func moveAndCheck(movePixel int, mouseMoveSuccessCh chan bool) { } } -func (m *MouseMover) isRunning() bool { - m.mutex.RLock() - defer m.mutex.RUnlock() - return m.runningStatus +//getters and setters for state variable +func (s *state) isRunning() bool { + s.mutex.RLock() + defer s.mutex.RUnlock() + return s.isAppRunning } -func (m *MouseMover) updateRunningStatus(isRunning bool) { - m.mutex.Lock() - defer m.mutex.Unlock() - m.runningStatus = isRunning + +func (s *state) updateRunningStatus(isRunning bool) { + s.mutex.Lock() + defer s.mutex.Unlock() + s.isAppRunning = isRunning +} + +func (s *state) isSystemSleeping() bool { + s.mutex.RLock() + defer s.mutex.RUnlock() + return s.isSysSleeping +} + +func (s *state) updateMachineSleepStatus(isSleeping bool) { + s.mutex.Lock() + defer s.mutex.Unlock() + s.isSysSleeping = isSleeping +} + +func (s *state) getLastMouseMovedTime() time.Time { + s.mutex.RLock() + defer s.mutex.RUnlock() + return s.lastMouseMovedTime +} + +func (s *state) updateLastMouseMovedTime(time time.Time) { + s.mutex.Lock() + defer s.mutex.Unlock() + s.lastMouseMovedTime = time +} + +func (s *state) getDidNotMoveCount() int { + s.mutex.RLock() + defer s.mutex.RUnlock() + return s.didNotMoveCount +} + +func (s *state) updateDidNotMoveCount(count int) { + s.mutex.Lock() + defer s.mutex.Unlock() + s.didNotMoveCount = count } diff --git a/pkg/mousemover/mouseMover_test.go b/pkg/mousemover/mouseMover_test.go index cca5df5..6606ca1 100644 --- a/pkg/mousemover/mouseMover_test.go +++ b/pkg/mousemover/mouseMover_test.go @@ -7,21 +7,23 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" + "github.com/prashantgupta24/activity-tracker/pkg/activity" "github.com/prashantgupta24/activity-tracker/pkg/tracker" ) type TestMover struct { suite.Suite activityTracker *tracker.Instance - heartbeatCh chan *tracker.Heartbeat + heartbeatCh chan *tracker.Heartbeat } func TestSuite(t *testing.T) { suite.Run(t, new(TestMover)) } + //Run once before all tests func (suite *TestMover) SetupSuite() { - heartbeatInterval := 60 + heartbeatInterval := 60 workerInterval := 10 suite.activityTracker = &tracker.Instance{ @@ -29,14 +31,20 @@ func (suite *TestMover) SetupSuite() { WorkerInterval: workerInterval, } - suite.heartbeatCh= make(chan *tracker.Heartbeat) + suite.heartbeatCh = make(chan *tracker.Heartbeat) } //Run once before each test func (suite *TestMover) SetupTest() { instance = nil } - +func (suite *TestMover) TestAppStart() { + t := suite.T() + mouseMover := GetInstance() + mouseMover.run(suite.heartbeatCh, suite.activityTracker) + time.Sleep(time.Millisecond * 500) //wait for app to start + assert.True(t, mouseMover.state.isRunning(), "app should have started") +} func (suite *TestMover) TestSingleton() { t := suite.T() @@ -46,15 +54,83 @@ func (suite *TestMover) TestSingleton() { time.Sleep(time.Millisecond * 500) mouseMover2 := GetInstance() - assert.True(t, mouseMover2.isRunning(), "instance should have started") + assert.True(t, mouseMover2.state.isRunning(), "instance should have started") } -func (suite *TestMover) TestAppStartAndStop() { + +func (suite *TestMover) TestSystemSleep() { t := suite.T() mouseMover := GetInstance() - mouseMover.run(suite.heartbeatCh, suite.activityTracker) + + heartbeatCh := make(chan *tracker.Heartbeat) + mouseMover.run(heartbeatCh, suite.activityTracker) time.Sleep(time.Millisecond * 500) //wait for app to start - assert.True(t, mouseMover.isRunning(), "app should have started") - mouseMover.Quit() - time.Sleep(time.Millisecond * 1000) //wait for app to stop - assert.False(t, mouseMover.isRunning(), "app should have stopped") + assert.True(t, mouseMover.state.isRunning(), "instance should have started") + assert.False(t, mouseMover.state.isSystemSleeping(), "machine should not be sleeping") + + //fake a machine-sleep activity + machineSleepActivityMap := make(map[activity.Type][]time.Time) + var timeArray []time.Time + timeArray = append(timeArray, time.Now()) + machineSleepActivityMap[activity.MachineSleep] = timeArray + heartbeatCh <- &tracker.Heartbeat{ + WasAnyActivity: true, + ActivityMap: machineSleepActivityMap, + } + time.Sleep(time.Millisecond * 500) //wait for it to be registered + assert.True(t, mouseMover.state.isSystemSleeping(), "machine should be sleeping now") +} + +func (suite *TestMover) TestMouseMoveSuccess() { + t := suite.T() + mouseMover := GetInstance() + + state := &state{ + override: &override{ + valueToReturn: true, + }, + } + mouseMover.state = state + heartbeatCh := make(chan *tracker.Heartbeat) + + mouseMover.run(heartbeatCh, suite.activityTracker) + time.Sleep(time.Millisecond * 500) //wait for app to start + assert.True(t, state.isRunning(), "instance should have started") + assert.False(t, state.isSystemSleeping(), "machine should not be sleeping") + assert.True(t, time.Time.IsZero(state.getLastMouseMovedTime()), "should be default") + assert.Equal(t, state.getDidNotMoveCount(), 0, "should be 0") + + heartbeatCh <- &tracker.Heartbeat{ + WasAnyActivity: false, + } + + time.Sleep(time.Millisecond * 500) //wait for it to be registered + assert.False(t, time.Time.IsZero(state.getLastMouseMovedTime()), "should be default but is ", state.getLastMouseMovedTime()) +} + +func (suite *TestMover) TestMouseMoveFailure() { + t := suite.T() + mouseMover := GetInstance() + + state := &state{ + override: &override{ + valueToReturn: false, + }, + } + mouseMover.state = state + heartbeatCh := make(chan *tracker.Heartbeat) + + mouseMover.run(heartbeatCh, suite.activityTracker) + time.Sleep(time.Millisecond * 500) //wait for app to start + assert.True(t, state.isRunning(), "instance should have started") + assert.False(t, state.isSystemSleeping(), "machine should not be sleeping") + assert.True(t, time.Time.IsZero(state.getLastMouseMovedTime()), "should be default") + assert.Equal(t, state.getDidNotMoveCount(), 0, "should be 0") + + heartbeatCh <- &tracker.Heartbeat{ + WasAnyActivity: false, + } + + time.Sleep(time.Millisecond * 500) //wait for it to be registered + assert.True(t, time.Time.IsZero(state.getLastMouseMovedTime()), "should be default but is ", state.getLastMouseMovedTime()) + assert.NotEqual(t, state.getDidNotMoveCount(), 0, "should not be 0") } diff --git a/pkg/mousemover/types.go b/pkg/mousemover/types.go new file mode 100644 index 0000000..f7265e7 --- /dev/null +++ b/pkg/mousemover/types.go @@ -0,0 +1,29 @@ +package mousemover + +import ( + "os" + "sync" + "time" +) + +//MouseMover is the main struct for the app +type MouseMover struct { + quit chan struct{} + logFile *os.File + state *state +} + +//state manages the internal working of the app +type state struct { + mutex sync.RWMutex + isAppRunning bool + isSysSleeping bool + lastMouseMovedTime time.Time + didNotMoveCount int + override *override +} + +//only needed for tests +type override struct { + valueToReturn bool +} From 642e2f3924560ec3863ab3e750ea23f31ea06596 Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Tue, 30 Apr 2019 18:55:14 -0700 Subject: [PATCH 4/8] updated makefile --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index faf08c0..dc4880b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ COVER_PROFILE=cover.out COVER_HTML=cover.html +.PHONY: $(COVER_PROFILE) $(COVER_HTML) + all: open build: clean From 90d53f3e4c05f7f71e071b8f8def4abae33537fd Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Tue, 30 Apr 2019 19:45:09 -0700 Subject: [PATCH 5/8] added machine wake test --- pkg/mousemover/mouseMover_test.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pkg/mousemover/mouseMover_test.go b/pkg/mousemover/mouseMover_test.go index 6606ca1..1e4112f 100644 --- a/pkg/mousemover/mouseMover_test.go +++ b/pkg/mousemover/mouseMover_test.go @@ -57,7 +57,7 @@ func (suite *TestMover) TestSingleton() { assert.True(t, mouseMover2.state.isRunning(), "instance should have started") } -func (suite *TestMover) TestSystemSleep() { +func (suite *TestMover) TestSystemSleepAndWake() { t := suite.T() mouseMover := GetInstance() @@ -69,15 +69,28 @@ func (suite *TestMover) TestSystemSleep() { //fake a machine-sleep activity machineSleepActivityMap := make(map[activity.Type][]time.Time) - var timeArray []time.Time - timeArray = append(timeArray, time.Now()) - machineSleepActivityMap[activity.MachineSleep] = timeArray + var sleepTimeArray []time.Time + sleepTimeArray = append(sleepTimeArray, time.Now()) + machineSleepActivityMap[activity.MachineSleep] = sleepTimeArray heartbeatCh <- &tracker.Heartbeat{ WasAnyActivity: true, ActivityMap: machineSleepActivityMap, } time.Sleep(time.Millisecond * 500) //wait for it to be registered assert.True(t, mouseMover.state.isSystemSleeping(), "machine should be sleeping now") + + //fake a machine-wake activity + machineWakeActivityMap := make(map[activity.Type][]time.Time) + var wakeTimeArray []time.Time + wakeTimeArray = append(wakeTimeArray, time.Now()) + machineWakeActivityMap[activity.MachineWake] = wakeTimeArray + heartbeatCh <- &tracker.Heartbeat{ + WasAnyActivity: true, + ActivityMap: machineWakeActivityMap, + } + + time.Sleep(time.Millisecond * 500) //wait for it to be registered + assert.False(t, mouseMover.state.isSystemSleeping(), "machine should be awake now") } func (suite *TestMover) TestMouseMoveSuccess() { From 118bce49e029e5618ff4868193be5929893ef930 Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Wed, 1 May 2019 16:50:28 -0700 Subject: [PATCH 6/8] ignoring assets pkg in lint --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index dc4880b..c40c0c4 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,8 @@ clean: start: go run cmd/main.go +test:coverage + coverage: $(COVER_HTML) $(COVER_HTML): $(COVER_PROFILE) @@ -33,7 +35,7 @@ vet: go vet $(shell glide nv) lint: - go list ./... | grep -v vendor | xargs -L1 golint -set_exit_status + go list ./... | grep -v vendor | grep -v /assets/ |xargs -L1 golint -set_exit_status .PHONY: build .PHONY: clean \ No newline at end of file From 8e8be9bbe947d9dbc93483431783f9adc263f1af Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Wed, 1 May 2019 18:28:55 -0700 Subject: [PATCH 7/8] adding godoc --- pkg/mousemover/doc.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 pkg/mousemover/doc.go diff --git a/pkg/mousemover/doc.go b/pkg/mousemover/doc.go new file mode 100644 index 0000000..8ee78a0 --- /dev/null +++ b/pkg/mousemover/doc.go @@ -0,0 +1,24 @@ +/* +Ever felt the need to keep your machine awake without having to resort to the age-old +methods of installing an app that you don't trust or playing a video? Well, not anymore! + +Introducing the simplest app on the market that has the sole purpose of moving your mouse +pointer at regular intervals so that your machine never sleeps! And best of all, it works +ONLY when you are not working, so be rest assured that the mouse won't start moving on its +own without the machine actually being idle. + + +Installation + +The libary can be installed using: + go get -u github.com/automatic-mouse-mover/pkg/mousemover + +Usage + +Clone this repo and run Make, it should create the amm.app and open the folder where +it was built for you. You just have to drag and drop it to the Applications folder on your mac. + +Refer to the README for more details. + +*/ +package mousemover From 19e0318359398bd755355450340459d5ca42c232 Mon Sep 17 00:00:00 2001 From: Prashant Gupta Date: Thu, 2 May 2019 17:58:01 -0700 Subject: [PATCH 8/8] adding tests --- pkg/mousemover/mouseMover.go | 4 +--- pkg/mousemover/mouseMoverUtil.go | 4 ++-- pkg/mousemover/mouseMover_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/pkg/mousemover/mouseMover.go b/pkg/mousemover/mouseMover.go index db6461e..42c6a2d 100644 --- a/pkg/mousemover/mouseMover.go +++ b/pkg/mousemover/mouseMover.go @@ -46,10 +46,8 @@ func (m *MouseMover) run(heartbeatCh chan *tracker.Heartbeat, activityTracker *t } state.updateRunningStatus(true) - logger := getLogger(m, false) //set writeToFile=true only for debugging + logger := getLogger(m, false, logFileName) //set writeToFile=true only for debugging movePixel := 10 - // var lastMoved time.Time - // didNotMoveTimes := 0 for { select { case heartbeat := <-heartbeatCh: diff --git a/pkg/mousemover/mouseMoverUtil.go b/pkg/mousemover/mouseMoverUtil.go index b686a69..3034aa1 100644 --- a/pkg/mousemover/mouseMoverUtil.go +++ b/pkg/mousemover/mouseMoverUtil.go @@ -9,7 +9,7 @@ import ( log "github.com/sirupsen/logrus" ) -func getLogger(m *MouseMover, doWriteToFile bool) *log.Logger { +func getLogger(m *MouseMover, doWriteToFile bool, filename string) *log.Logger { logger := log.New() logger.Formatter = &logrus.TextFormatter{ FullTimestamp: true, @@ -26,7 +26,7 @@ func getLogger(m *MouseMover, doWriteToFile bool) *log.Logger { } } - logFile, err := os.OpenFile(logDir+"/"+logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + logFile, err := os.OpenFile(logDir+"/"+filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("error opening file: %v", err) } diff --git a/pkg/mousemover/mouseMover_test.go b/pkg/mousemover/mouseMover_test.go index 1e4112f..29e41e2 100644 --- a/pkg/mousemover/mouseMover_test.go +++ b/pkg/mousemover/mouseMover_test.go @@ -1,6 +1,7 @@ package mousemover import ( + "os" "testing" "time" @@ -57,11 +58,29 @@ func (suite *TestMover) TestSingleton() { assert.True(t, mouseMover2.state.isRunning(), "instance should have started") } +func (suite *TestMover) TestLogFile() { + t := suite.T() + mouseMover := GetInstance() + logFileName := "test1" + + getLogger(mouseMover, true, logFileName) + + filePath := logDir + "/" + logFileName + assert.FileExists(t, filePath, "log file should exist") + os.RemoveAll(filePath) +} func (suite *TestMover) TestSystemSleepAndWake() { t := suite.T() mouseMover := GetInstance() + state := &state{ + override: &override{ + valueToReturn: true, + }, + } + mouseMover.state = state heartbeatCh := make(chan *tracker.Heartbeat) + mouseMover.run(heartbeatCh, suite.activityTracker) time.Sleep(time.Millisecond * 500) //wait for app to start assert.True(t, mouseMover.state.isRunning(), "instance should have started") @@ -79,6 +98,15 @@ func (suite *TestMover) TestSystemSleepAndWake() { time.Sleep(time.Millisecond * 500) //wait for it to be registered assert.True(t, mouseMover.state.isSystemSleeping(), "machine should be sleeping now") + //assert app is sleeping + heartbeatCh <- &tracker.Heartbeat{ + WasAnyActivity: false, + } + + time.Sleep(time.Millisecond * 500) //wait for it to be registered + assert.True(t, time.Time.IsZero(state.getLastMouseMovedTime()), "should be default but is ", state.getLastMouseMovedTime()) + assert.Equal(t, state.getDidNotMoveCount(), 0, "should be 0") + //fake a machine-wake activity machineWakeActivityMap := make(map[activity.Type][]time.Time) var wakeTimeArray []time.Time