github.com/mysteriumnetwork/node@v0.0.0-20240516044423-365054f76801/session/pingpong/job_test.go (about) 1 /* 2 * Copyright (C) 2021 The "MysteriumNetwork/node" Authors. 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 package pingpong 19 20 import ( 21 "sync/atomic" 22 "testing" 23 "time" 24 25 "github.com/stretchr/testify/assert" 26 ) 27 28 func TestJob(t *testing.T) { 29 var ops uint64 30 var actualWork = func() string { 31 atomic.AddUint64(&ops, 1) 32 return "doing actual work" 33 } 34 f := func(stop <-chan struct{}) { 35 for { 36 actualWork() 37 select { 38 case <-stop: 39 return 40 case <-time.After(time.Millisecond): 41 } 42 } 43 } 44 j := newJob(f, time.Millisecond*5) 45 j.Start() 46 47 go func() { 48 time.Sleep(time.Millisecond * 3) 49 j.Stop() 50 }() 51 52 <-j.Done() 53 54 loaded := atomic.LoadUint64(&ops) 55 // assert work was done 56 assert.Greater(t, loaded, uint64(0)) 57 58 nj := j.Restart() 59 <-nj.Done() 60 61 // assert more work was done 62 current := atomic.LoadUint64(&ops) 63 assert.Greater(t, current, loaded) 64 }