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") }