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  }