code.vegaprotocol.io/vega@v0.79.0/core/datasource/common/time_test.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  //lint:file-ignore ST1003 Ignore underscores in names, this is straigh copied from the proto package to ease introducing the domain types
    17  
    18  package common_test
    19  
    20  import (
    21  	"fmt"
    22  	"testing"
    23  	"time"
    24  
    25  	"code.vegaprotocol.io/vega/core/datasource/common"
    26  	"code.vegaprotocol.io/vega/libs/ptr"
    27  	datapb "code.vegaprotocol.io/vega/protos/vega/data/v1"
    28  
    29  	"github.com/stretchr/testify/assert"
    30  )
    31  
    32  func TestInternalTimeTriggerString(t *testing.T) {
    33  	timeNow := time.Now()
    34  	nt := timeNow.Add(time.Minute)
    35  
    36  	tt := common.InternalTimeTrigger{
    37  		Initial: &timeNow,
    38  		Every:   int64(15),
    39  	}
    40  
    41  	tt.SetNextTrigger(nt)
    42  	assert.Equal(
    43  		t,
    44  		fmt.Sprintf("initial(%s) every(15) nextTrigger(%s)", timeNow, nt),
    45  		tt.String(),
    46  	)
    47  }
    48  
    49  func TestInternalTimeTriggerIntoProto(t *testing.T) {
    50  	timeNow := time.Now()
    51  	tt := common.InternalTimeTrigger{
    52  		Initial: &timeNow,
    53  		Every:   int64(15),
    54  	}
    55  
    56  	pt := tt.IntoProto()
    57  	assert.NotNil(t, pt)
    58  	assert.IsType(t, &datapb.InternalTimeTrigger{}, pt)
    59  	assert.Equal(t, timeNow.Unix(), *pt.Initial)
    60  	assert.Equal(t, int64(15), pt.Every)
    61  }
    62  
    63  func TestInternalTimeTriggerDeepClone(t *testing.T) {
    64  	timeNow := time.Now()
    65  	tt := common.InternalTimeTrigger{
    66  		Initial: &timeNow,
    67  		Every:   int64(15),
    68  	}
    69  
    70  	pt := tt.DeepClone()
    71  	assert.NotNil(t, pt)
    72  	assert.IsType(t, &common.InternalTimeTrigger{}, pt)
    73  	assert.Equal(t, timeNow, *pt.Initial)
    74  	assert.Equal(t, int64(15), pt.Every)
    75  }
    76  
    77  func TestInternalTimeTriggerIsTriggered(t *testing.T) {
    78  	timeNow := time.Now()
    79  	nt := timeNow.Add(time.Minute)
    80  	tt := common.InternalTimeTrigger{
    81  		Initial: &timeNow,
    82  		Every:   int64(15),
    83  	}
    84  
    85  	tt.SetNextTrigger(nt)
    86  	// Given time is before the next trigger
    87  	triggered := tt.IsTriggered(timeNow)
    88  	assert.Equal(t, false, triggered)
    89  
    90  	// Given time is the same as the next trigger
    91  	triggered = tt.IsTriggered(nt)
    92  	assert.Equal(t, false, triggered)
    93  
    94  	// Given time is after the next trigger
    95  	triggered = tt.IsTriggered(nt.Add(time.Second * 2))
    96  	assert.Equal(t, true, triggered)
    97  }
    98  
    99  func TestInternalTimeTriggerFromProto(t *testing.T) {
   100  	timeNow := time.Now()
   101  	tt := common.InternalTimeTrigger{
   102  		Initial: &timeNow,
   103  		Every:   int64(15),
   104  	}
   105  
   106  	pt := tt.IntoProto()
   107  	ntt := common.InternalTimeTriggerFromProto(pt)
   108  	assert.NotNil(t, pt)
   109  	assert.IsType(t, &common.InternalTimeTrigger{}, ntt)
   110  	assert.Equal(t, ptr.From(time.Unix(timeNow.Unix(), 0)), ntt.Initial)
   111  	assert.Equal(t, int64(15), ntt.Every)
   112  }
   113  
   114  func TestInternalTimeTriggersString(t *testing.T) {
   115  	timeNow := time.Now()
   116  
   117  	tt := &common.InternalTimeTrigger{
   118  		Initial: &timeNow,
   119  		Every:   int64(15),
   120  	}
   121  
   122  	var ttl common.InternalTimeTriggers
   123  	assert.Equal(t, "[nil]", ttl.String())
   124  
   125  	ttl = common.InternalTimeTriggers{}
   126  	assert.Equal(t, "[nil]", ttl.String())
   127  
   128  	ttl = common.InternalTimeTriggers{tt}
   129  	assert.Equal(
   130  		t,
   131  		fmt.Sprintf("[initial(%s) every(15) nextTrigger(<nil>)]", timeNow),
   132  		ttl.String(),
   133  	)
   134  }
   135  
   136  func TestInternalTimeTriggersIntoProto(t *testing.T) {
   137  	timeNow := time.Now()
   138  	tt := &common.InternalTimeTrigger{
   139  		Initial: &timeNow,
   140  		Every:   int64(15),
   141  	}
   142  
   143  	ttl := common.InternalTimeTriggers{tt}
   144  
   145  	pt := ttl.IntoProto()
   146  	assert.NotNil(t, pt)
   147  	assert.IsType(t, []*datapb.InternalTimeTrigger{}, pt)
   148  	assert.Equal(t, 1, len(pt))
   149  	assert.Equal(t, timeNow.Unix(), *pt[0].Initial)
   150  	assert.Equal(t, int64(15), pt[0].Every)
   151  }
   152  
   153  func TestInternalTimeTriggersIsTriggered(t *testing.T) {
   154  	timeNow := time.Now()
   155  	nt := timeNow.Add(time.Minute)
   156  	tt := &common.InternalTimeTrigger{
   157  		Initial: &timeNow,
   158  		Every:   int64(15),
   159  	}
   160  
   161  	tt.SetNextTrigger(nt)
   162  	ttl := common.InternalTimeTriggers{tt}
   163  
   164  	// Given time is before the next trigger
   165  	triggered := ttl.IsTriggered(timeNow)
   166  	assert.Equal(t, false, triggered)
   167  
   168  	// Given time is the same as the next trigger
   169  	triggered = ttl.IsTriggered(nt)
   170  	assert.Equal(t, false, triggered)
   171  
   172  	// Given time is after the next trigger
   173  	triggered = ttl.IsTriggered(nt.Add(time.Second * 15))
   174  	assert.Equal(t, true, triggered)
   175  
   176  	// check trigger time is progressed
   177  	triggered = ttl.IsTriggered(nt.Add(time.Second * 15))
   178  	assert.Equal(t, false, triggered)
   179  }
   180  
   181  func TestInternalTimeTriggersIsTriggeredLongInterval(t *testing.T) {
   182  	timeNow := time.Now()
   183  	nt := timeNow.Add(time.Minute)
   184  	tt := &common.InternalTimeTrigger{
   185  		Initial: &timeNow,
   186  		Every:   int64(15),
   187  	}
   188  
   189  	tt.SetNextTrigger(nt)
   190  	ttl := common.InternalTimeTriggers{tt}
   191  
   192  	// Given time is after the next trigger many multiples of "every"
   193  	triggered := ttl.IsTriggered(nt.Add(time.Second * 60))
   194  	assert.Equal(t, true, triggered)
   195  
   196  	// check we rolled forward and a past time is not triggered
   197  	triggered = ttl.IsTriggered(nt.Add(time.Second * 30))
   198  	assert.Equal(t, false, triggered)
   199  }