github.com/webx-top/com@v1.2.12/goroutine_test.go (about)

     1  package com
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"log"
     7  	"math"
     8  	"sync"
     9  	"sync/atomic"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestLoop(t *testing.T) {
    17  	ctx, cancel := context.WithCancel(context.Background())
    18  	go Loop(ctx, func() error {
    19  		fmt.Println(`Loop`, time.Now())
    20  		return nil
    21  	}, time.Second*1)
    22  	time.Sleep(time.Second * 5)
    23  	cancel()
    24  }
    25  
    26  func TestDelayOnceNormal(t *testing.T) {
    27  	d := NewDelayOnce(time.Second*2, time.Hour, true)
    28  	defer d.Close()
    29  	ctx := context.TODO()
    30  	wg := sync.WaitGroup{}
    31  	var lastTime time.Time
    32  	var execTime time.Time
    33  	var counter atomic.Int32
    34  	for i := 0; i < 10; i++ {
    35  		log.Println(`Trigger key_normal`)
    36  		lastTime = time.Now()
    37  		isNew := d.Do(ctx, `key_normal`, func() error {
    38  			defer wg.Done()
    39  			log.Println(`>Execute key_normal<`)
    40  			execTime = time.Now()
    41  			time.Sleep(time.Second * 3)
    42  			counter.Add(1)
    43  			return nil
    44  		})
    45  		if isNew {
    46  			wg.Add(1)
    47  		}
    48  		//time.Sleep(time.Second * 2)
    49  	}
    50  	wg.Wait()
    51  	assert.Equal(t, float64(2), math.Floor(execTime.Sub(lastTime).Seconds()))
    52  	assert.Equal(t, int32(1), counter.Load())
    53  }
    54  
    55  func TestDelayOnceTimeout(t *testing.T) {
    56  	d := NewDelayOnce(time.Second*2, time.Second*5, true)
    57  	defer d.Close()
    58  	ctx := context.TODO()
    59  	wg := sync.WaitGroup{}
    60  	var lastTime time.Time
    61  	var execTime time.Time
    62  	var counter atomic.Int32
    63  	for i := 0; i < 3; i++ {
    64  		log.Println(`Trigger key_timeout`)
    65  		lastTime = time.Now()
    66  		isNew := d.DoWithState(ctx, `key_timeout`, func(isAbort func() bool) error {
    67  			defer wg.Done()
    68  			execTime = time.Now()
    69  			for i := 0; i < 4; i++ {
    70  				if isAbort() {
    71  					log.Println(`------> Stop key_timeout`)
    72  					return nil
    73  				}
    74  				log.Println(`Execute key_timeout`, i)
    75  				time.Sleep(time.Second * 5)
    76  			}
    77  			log.Println(`>Execute key_timeout<`)
    78  			counter.Add(1)
    79  			return nil
    80  		})
    81  		if isNew {
    82  			wg.Add(1)
    83  		}
    84  		//time.Sleep(time.Second * 6)
    85  	}
    86  	wg.Wait()
    87  	assert.Equal(t, float64(2), math.Floor(execTime.Sub(lastTime).Seconds()))
    88  	assert.Equal(t, int32(1), counter.Load())
    89  }