gitee.com/h79/goutils@v1.22.10/common/scheduler/cron_test.go (about)

     1  package scheduler
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  func assertEqual(t *testing.T, a interface{}, b interface{}) {
    11  	if !reflect.DeepEqual(a, b) {
    12  		t.Fatalf("%v != %v", a, b)
    13  	}
    14  }
    15  
    16  func TestCronExpression1(t *testing.T) {
    17  	prev := int64(1555351200000000000)
    18  	result := ""
    19  	cronTrigger, err := NewCronTrigger("10/20 15 14 5-10 ? *")
    20  	cronTrigger.WithLocation(time.UTC).Description()
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	} else {
    24  		result, _ = iterate(prev, cronTrigger, 1000)
    25  	}
    26  	assertEqual(t, result, "Fri Dec 8 14:15:10 2023")
    27  }
    28  
    29  func TestCronExpression2(t *testing.T) {
    30  	prev := int64(1555351200000000000)
    31  	result := ""
    32  	cronTrigger, err := NewCronTrigger("* 5,7,9 14-16 * * ?")
    33  	if err != nil {
    34  		t.Fatal(err)
    35  	} else {
    36  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
    37  	}
    38  	assertEqual(t, result, "Mon Aug 5 14:05:00 2019")
    39  }
    40  
    41  func TestCronExpression3(t *testing.T) {
    42  	prev := int64(1555351200000000000)
    43  	result := ""
    44  	cronTrigger, err := NewCronTrigger("* 5,7,9 14/2 * * Wed,Sat")
    45  	if err != nil {
    46  		t.Fatal(err)
    47  	} else {
    48  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
    49  	}
    50  	t.Log(result)
    51  }
    52  
    53  func TestCronExpression4(t *testing.T) {
    54  	expression := "0 5,7 14 1 * Sun"
    55  	_, err := NewCronTrigger(expression)
    56  	if err != nil {
    57  		t.Fatalf("%s should fail", expression)
    58  	}
    59  }
    60  
    61  func TestCronExpression5(t *testing.T) {
    62  	prev := int64(1555351200000000000)
    63  	result := ""
    64  	cronTrigger, err := NewCronTrigger("* * * * * ?")
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	} else {
    68  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
    69  	}
    70  	assertEqual(t, result, "Mon Apr 15 18:16:40 2019")
    71  }
    72  
    73  func TestCronExpression6(t *testing.T) {
    74  	prev := int64(1555351200000000000)
    75  	result := ""
    76  	cronTrigger, err := NewCronTrigger("* * 14/2 * * mon/3")
    77  	if err != nil {
    78  		t.Fatal(err)
    79  	} else {
    80  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
    81  	}
    82  	assertEqual(t, result, "Mon Mar 15 18:00:00 2021")
    83  }
    84  
    85  func TestCronExpression7(t *testing.T) {
    86  	prev := int64(1555351200000000000)
    87  	result := ""
    88  	cronTrigger, err := NewCronTrigger("* 5-9 14/2 * * 1-3")
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	} else {
    92  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
    93  	}
    94  	assertEqual(t, result, "Tue Jul 16 16:09:00 2019")
    95  }
    96  
    97  func TestCronExpression8(t *testing.T) {
    98  	prev := int64(1555351200000000000)
    99  	t.Log(time.Unix(0, prev).In(time.UTC))
   100  	result := ""
   101  	cronTrigger, err := NewCronTrigger("*/3 */51 */12 */2 */4 ?")
   102  	if err != nil {
   103  		t.Fatal(err)
   104  	} else {
   105  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
   106  	}
   107  	assertEqual(t, result, "Sat Sep 7 12:00:00 2019")
   108  }
   109  
   110  func TestCronYearly(t *testing.T) {
   111  	prev := int64(1555351200000000000)
   112  	result := ""
   113  	cronTrigger, err := NewCronTrigger("@yearly")
   114  	if err != nil {
   115  		t.Fatal(err)
   116  	} else {
   117  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 100)
   118  	}
   119  	assertEqual(t, result, "Sun Jan 1 00:00:00 2119")
   120  }
   121  
   122  func TestCronMonthly(t *testing.T) {
   123  	prev := int64(1555351200000000000)
   124  	result := ""
   125  	cronTrigger, err := NewCronTrigger("@monthly")
   126  	if err != nil {
   127  		t.Fatal(err)
   128  	} else {
   129  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 100)
   130  	}
   131  	assertEqual(t, result, "Sun Aug 1 00:00:00 2027")
   132  }
   133  
   134  func TestCronWeekly(t *testing.T) {
   135  	prev := int64(1555351200000000000)
   136  	result := ""
   137  	cronTrigger, err := NewCronTrigger("@weekly")
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	} else {
   141  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 100)
   142  	}
   143  	assertEqual(t, result, "Sun Mar 14 00:00:00 2021")
   144  }
   145  
   146  func TestCronDaily(t *testing.T) {
   147  	prev := int64(1555351200000000000)
   148  	result := ""
   149  	cronTrigger, err := NewCronTrigger("@daily")
   150  	if err != nil {
   151  		t.Fatal(err)
   152  	} else {
   153  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
   154  	}
   155  	assertEqual(t, result, "Sun Jan 9 00:00:00 2022")
   156  }
   157  
   158  func TestCronHourly(t *testing.T) {
   159  	prev := int64(1555351200000000000)
   160  	result := ""
   161  	cronTrigger, err := NewCronTrigger("@hourly")
   162  	if err != nil {
   163  		t.Fatal(err)
   164  	} else {
   165  		result, _ = iterate(prev, cronTrigger.WithLocation(time.UTC), 1000)
   166  	}
   167  	assertEqual(t, result, "Mon May 27 10:00:00 2019")
   168  }
   169  
   170  var readDateLayout = "Mon Jan 2 15:04:05 2006"
   171  
   172  func iterate(prev int64, cronTrigger *CronTrigger, iterations int) (string, error) {
   173  	var err error
   174  	for i := 0; i < iterations; i++ {
   175  		prev, err = cronTrigger.NextFireTime(prev)
   176  		if err != nil {
   177  			fmt.Println(err)
   178  			return "", err
   179  		}
   180  	}
   181  	return time.Unix(prev/int64(time.Second), 0).In(time.UTC).Format(readDateLayout), nil
   182  }