1
// Copyright (c) 2016-2019 Uber Technologies, Inc.
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
7
// http://www.apache.org/licenses/LICENSE-2.0
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
21
"github.com/uber/kraken/mocks/utils/dedup"
22
. "github.com/uber/kraken/utils/dedup"
23
"github.com/uber/kraken/utils/randutil"
25
"github.com/andres-erbsen/clock"
26
"github.com/golang/mock/gomock"
29
func TestIntervalTrap(t *testing.T) {
30
ctrl := gomock.NewController(t)
33
interval := time.Minute
34
clk := clock.NewMock()
36
task := mockdedup.NewMockIntervalTask(ctrl)
38
trap := NewIntervalTrap(interval, clk, task)
57
func TestIntervalTrapConcurrency(t *testing.T) {
58
ctrl := gomock.NewController(t)
61
task := mockdedup.NewMockIntervalTask(ctrl)
63
trap := NewIntervalTrap(100*time.Millisecond, clock.New(), task)
65
task.EXPECT().Run().Times(4)
68
for i := 0; i < 50; i++ {
72
for k := 0; k < 4; k++ {
73
// Guarantees that Trap() will be called exactly 4 times,
74
// as the interval between each Trap() call is >= 100ms
75
// for each goroutine and the total interval for a given
76
// goroutine will never reach 500ms.
77
time.Sleep(120*time.Millisecond +
78
randutil.Duration(10*time.Millisecond))