Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
43d13a3e
Commit
43d13a3e
authored
Oct 11, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: tweak linter
parent
f467f1d9
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
54 additions
and
57 deletions
+54
-57
chain.go
internal/cron/chain.go
+2
-1
chain_test.go
internal/cron/chain_test.go
+11
-15
cron.go
internal/cron/cron.go
+12
-12
cron_test.go
internal/cron/cron_test.go
+6
-6
parser.go
internal/cron/parser.go
+19
-19
parser_test.go
internal/cron/parser_test.go
+2
-2
oauth2_test.go
plugin/idp/oauth2/oauth2_test.go
+1
-1
resource_name_test.go
test/util/resource_name_test.go
+1
-1
No files found.
internal/cron/chain.go
View file @
43d13a3e
package
cron
import
(
"errors"
"fmt"
"runtime"
"sync"
...
...
@@ -48,7 +49,7 @@ func Recover(logger Logger) JobWrapper {
buf
=
buf
[
:
runtime
.
Stack
(
buf
,
false
)]
err
,
ok
:=
r
.
(
error
)
if
!
ok
{
err
=
fmt
.
Errorf
(
"%v"
,
r
)
err
=
errors
.
New
(
"panic: "
+
fmt
.
Sprint
(
r
)
)
}
logger
.
Error
(
err
,
"panic"
,
"stack"
,
"...
\n
"
+
string
(
buf
))
}
...
...
internal/cron/chain_test.go
View file @
43d13a3e
...
...
@@ -46,7 +46,7 @@ func TestChainRecover(t *testing.T) {
panic
(
"panickingJob panics"
)
})
t
.
Run
(
"panic exits job by default"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"panic exits job by default"
,
func
(
*
testing
.
T
)
{
defer
func
()
{
if
err
:=
recover
();
err
==
nil
{
t
.
Errorf
(
"panic expected, but none received"
)
...
...
@@ -56,13 +56,13 @@ func TestChainRecover(t *testing.T) {
Run
()
})
t
.
Run
(
"Recovering JobWrapper recovers"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"Recovering JobWrapper recovers"
,
func
(
*
testing
.
T
)
{
NewChain
(
Recover
(
PrintfLogger
(
log
.
New
(
io
.
Discard
,
""
,
0
))))
.
Then
(
panickingJob
)
.
Run
()
})
t
.
Run
(
"composed with the *IfStillRunning wrappers"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"composed with the *IfStillRunning wrappers"
,
func
(
*
testing
.
T
)
{
NewChain
(
Recover
(
PrintfLogger
(
log
.
New
(
io
.
Discard
,
""
,
0
))))
.
Then
(
panickingJob
)
.
Run
()
...
...
@@ -99,8 +99,7 @@ func (j *countJob) Done() int {
}
func
TestChainDelayIfStillRunning
(
t
*
testing
.
T
)
{
t
.
Run
(
"runs immediately"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"runs immediately"
,
func
(
*
testing
.
T
)
{
var
j
countJob
wrappedJob
:=
NewChain
(
DelayIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
go
wrappedJob
.
Run
()
...
...
@@ -110,7 +109,7 @@ func TestChainDelayIfStillRunning(t *testing.T) {
}
})
t
.
Run
(
"second run immediate if first done"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"second run immediate if first done"
,
func
(
*
testing
.
T
)
{
var
j
countJob
wrappedJob
:=
NewChain
(
DelayIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
go
func
()
{
...
...
@@ -124,7 +123,7 @@ func TestChainDelayIfStillRunning(t *testing.T) {
}
})
t
.
Run
(
"second run delayed if first not done"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"second run delayed if first not done"
,
func
(
*
testing
.
T
)
{
var
j
countJob
j
.
delay
=
10
*
time
.
Millisecond
wrappedJob
:=
NewChain
(
DelayIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
...
...
@@ -149,12 +148,10 @@ func TestChainDelayIfStillRunning(t *testing.T) {
t
.
Error
(
"expected both jobs done, got"
,
started
,
done
)
}
})
}
func
TestChainSkipIfStillRunning
(
t
*
testing
.
T
)
{
t
.
Run
(
"runs immediately"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"runs immediately"
,
func
(
*
testing
.
T
)
{
var
j
countJob
wrappedJob
:=
NewChain
(
SkipIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
go
wrappedJob
.
Run
()
...
...
@@ -164,7 +161,7 @@ func TestChainSkipIfStillRunning(t *testing.T) {
}
})
t
.
Run
(
"second run immediate if first done"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"second run immediate if first done"
,
func
(
*
testing
.
T
)
{
var
j
countJob
wrappedJob
:=
NewChain
(
SkipIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
go
func
()
{
...
...
@@ -178,7 +175,7 @@ func TestChainSkipIfStillRunning(t *testing.T) {
}
})
t
.
Run
(
"second run skipped if first not done"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"second run skipped if first not done"
,
func
(
*
testing
.
T
)
{
var
j
countJob
j
.
delay
=
10
*
time
.
Millisecond
wrappedJob
:=
NewChain
(
SkipIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
...
...
@@ -204,7 +201,7 @@ func TestChainSkipIfStillRunning(t *testing.T) {
}
})
t
.
Run
(
"skip 10 jobs on rapid fire"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"skip 10 jobs on rapid fire"
,
func
(
*
testing
.
T
)
{
var
j
countJob
j
.
delay
=
10
*
time
.
Millisecond
wrappedJob
:=
NewChain
(
SkipIfStillRunning
(
DiscardLogger
))
.
Then
(
&
j
)
...
...
@@ -218,7 +215,7 @@ func TestChainSkipIfStillRunning(t *testing.T) {
}
})
t
.
Run
(
"different jobs independent"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"different jobs independent"
,
func
(
*
testing
.
T
)
{
var
j1
,
j2
countJob
j1
.
delay
=
10
*
time
.
Millisecond
j2
.
delay
=
10
*
time
.
Millisecond
...
...
@@ -238,5 +235,4 @@ func TestChainSkipIfStillRunning(t *testing.T) {
t
.
Error
(
"expected both jobs executed once, got"
,
done1
,
"and"
,
done2
)
}
})
}
internal/cron/cron.go
View file @
43d13a3e
...
...
@@ -26,7 +26,7 @@ type Cron struct {
jobWaiter
sync
.
WaitGroup
}
// ScheduleParser is an interface for schedule spec parsers that return a Schedule
// ScheduleParser is an interface for schedule spec parsers that return a Schedule
.
type
ScheduleParser
interface
{
Parse
(
spec
string
)
(
Schedule
,
error
)
}
...
...
@@ -43,7 +43,7 @@ type Schedule interface {
Next
(
time
.
Time
)
time
.
Time
}
// EntryID identifies an entry within a Cron instance
// EntryID identifies an entry within a Cron instance
.
type
EntryID
int
// Entry consists of a schedule and the func to execute on that schedule.
...
...
@@ -97,17 +97,17 @@ func (s byTime) Less(i, j int) bool {
//
// Available Settings
//
//
Time Zone
//
Description: The time zone in which schedules are interpreted
//
Default: time.Local
//
Time Zone
//
Description: The time zone in which schedules are interpreted
//
Default: time.Local
//
//
Parser
//
Description: Parser converts cron spec strings into cron.Schedules.
//
Default: Accepts this spec: https://en.wikipedia.org/wiki/Cron
//
Parser
//
Description: Parser converts cron spec strings into cron.Schedules.
//
Default: Accepts this spec: https://en.wikipedia.org/wiki/Cron
//
//
Chain
//
Description: Wrap submitted jobs to customize behavior.
//
Default: A chain that recovers panics and logs them to stderr.
//
Chain
//
Description: Wrap submitted jobs to customize behavior.
//
Default: A chain that recovers panics and logs them to stderr.
//
// See "cron.With*" to modify the default behavior.
func
New
(
opts
...
Option
)
*
Cron
{
...
...
@@ -130,7 +130,7 @@ func New(opts ...Option) *Cron {
return
c
}
// FuncJob is a wrapper that turns a func() into a cron.Job
// FuncJob is a wrapper that turns a func() into a cron.Job
.
type
FuncJob
func
()
func
(
f
FuncJob
)
Run
()
{
f
()
}
...
...
internal/cron/cron_test.go
View file @
43d13a3e
...
...
@@ -59,7 +59,7 @@ func TestFuncPanicRecovery(t *testing.T) {
type
DummyJob
struct
{}
func
(
d
DummyJob
)
Run
()
{
func
(
DummyJob
)
Run
()
{
panic
(
"YOLO"
)
}
...
...
@@ -556,7 +556,7 @@ func TestJobWithZeroTimeDoesNotRun(t *testing.T) {
}
func
TestStopAndWait
(
t
*
testing
.
T
)
{
t
.
Run
(
"nothing running, returns immediately"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"nothing running, returns immediately"
,
func
(
*
testing
.
T
)
{
cron
:=
newWithSeconds
()
cron
.
Start
()
ctx
:=
cron
.
Stop
()
...
...
@@ -567,7 +567,7 @@ func TestStopAndWait(t *testing.T) {
}
})
t
.
Run
(
"repeated calls to Stop"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"repeated calls to Stop"
,
func
(
*
testing
.
T
)
{
cron
:=
newWithSeconds
()
cron
.
Start
()
_
=
cron
.
Stop
()
...
...
@@ -580,7 +580,7 @@ func TestStopAndWait(t *testing.T) {
}
})
t
.
Run
(
"a couple fast jobs added, still returns immediately"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"a couple fast jobs added, still returns immediately"
,
func
(
*
testing
.
T
)
{
cron
:=
newWithSeconds
()
cron
.
AddFunc
(
"* * * * * *"
,
func
()
{})
cron
.
Start
()
...
...
@@ -596,7 +596,7 @@ func TestStopAndWait(t *testing.T) {
}
})
t
.
Run
(
"a couple fast jobs and a slow job added, waits for slow job"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"a couple fast jobs and a slow job added, waits for slow job"
,
func
(
*
testing
.
T
)
{
cron
:=
newWithSeconds
()
cron
.
AddFunc
(
"* * * * * *"
,
func
()
{})
cron
.
Start
()
...
...
@@ -623,7 +623,7 @@ func TestStopAndWait(t *testing.T) {
}
})
t
.
Run
(
"repeated calls to stop, waiting for completion and after"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"repeated calls to stop, waiting for completion and after"
,
func
(
*
testing
.
T
)
{
cron
:=
newWithSeconds
()
cron
.
AddFunc
(
"* * * * * *"
,
func
()
{})
cron
.
AddFunc
(
"* * * * * *"
,
func
()
{
time
.
Sleep
(
2
*
time
.
Second
)
})
...
...
internal/cron/parser.go
View file @
43d13a3e
package
cron
import
(
"fmt"
"math"
"strconv"
"strings"
"time"
"github.com/pkg/errors"
)
// Configuration options for creating a parser. Most options specify which
...
...
@@ -86,7 +87,7 @@ func NewParser(options ParseOption) Parser {
// It accepts crontab specs and features configured by NewParser.
func
(
p
Parser
)
Parse
(
spec
string
)
(
Schedule
,
error
)
{
if
len
(
spec
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"empty spec string"
)
return
nil
,
errors
.
New
(
"empty spec string"
)
}
// Extract timezone if present
...
...
@@ -96,7 +97,7 @@ func (p Parser) Parse(spec string) (Schedule, error) {
i
:=
strings
.
Index
(
spec
,
" "
)
eq
:=
strings
.
Index
(
spec
,
"="
)
if
loc
,
err
=
time
.
LoadLocation
(
spec
[
eq
+
1
:
i
]);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"provided bad location %s: %v"
,
spec
[
eq
+
1
:
i
],
err
)
return
nil
,
errors
.
Wrap
(
err
,
"provided bad location"
)
}
spec
=
strings
.
TrimSpace
(
spec
[
i
:
])
}
...
...
@@ -104,7 +105,7 @@ func (p Parser) Parse(spec string) (Schedule, error) {
// Handle named schedules (descriptors), if configured
if
strings
.
HasPrefix
(
spec
,
"@"
)
{
if
p
.
options
&
Descriptor
==
0
{
return
nil
,
fmt
.
Errorf
(
"parser does not accept descriptors: %v"
,
spec
)
return
nil
,
errors
.
New
(
"descriptors not enabled"
)
}
return
parseDescriptor
(
spec
,
loc
)
}
...
...
@@ -168,7 +169,7 @@ func normalizeFields(fields []string, options ParseOption) ([]string, error) {
optionals
++
}
if
optionals
>
1
{
return
nil
,
fmt
.
Errorf
(
"multiple optionals may not be configured"
)
return
nil
,
errors
.
New
(
"multiple optionals may not be configured"
)
}
// Figure out how many fields we need
...
...
@@ -183,9 +184,9 @@ func normalizeFields(fields []string, options ParseOption) ([]string, error) {
// Validate number of fields
if
count
:=
len
(
fields
);
count
<
min
||
count
>
max
{
if
min
==
max
{
return
nil
,
fmt
.
Errorf
(
"expected exactly %d fields, found %d: %s"
,
min
,
count
,
fields
)
return
nil
,
errors
.
New
(
"incorrect number of fields"
)
}
return
nil
,
fmt
.
Errorf
(
"expected %d to %d fields, found %d: %s"
,
min
,
max
,
count
,
fields
)
return
nil
,
errors
.
New
(
"incorrect number of fields, expected "
+
strconv
.
Itoa
(
min
)
+
"-"
+
strconv
.
Itoa
(
max
)
)
}
// Populate the optional field if not provided
...
...
@@ -196,7 +197,7 @@ func normalizeFields(fields []string, options ParseOption) ([]string, error) {
case
options
&
SecondOptional
>
0
:
fields
=
append
([]
string
{
defaults
[
0
]},
fields
...
)
default
:
return
nil
,
fmt
.
Errorf
(
"unknown
optional field"
)
return
nil
,
errors
.
New
(
"unexpected
optional field"
)
}
}
...
...
@@ -278,7 +279,7 @@ func getRange(expr string, r bounds) (uint64, error) {
return
0
,
err
}
default
:
return
0
,
fmt
.
Errorf
(
"too many hyphens: %s"
,
expr
)
return
0
,
errors
.
New
(
"too many hyphens: "
+
expr
)
}
}
...
...
@@ -299,20 +300,20 @@ func getRange(expr string, r bounds) (uint64, error) {
extra
=
0
}
default
:
return
0
,
fmt
.
Errorf
(
"too many slashes: %s"
,
expr
)
return
0
,
errors
.
New
(
"too many slashes: "
+
expr
)
}
if
start
<
r
.
min
{
return
0
,
fmt
.
Errorf
(
"beginning of range (%d) below minimum (%d): %s"
,
start
,
r
.
min
,
expr
)
return
0
,
errors
.
New
(
"beginning of range below minimum: "
+
expr
)
}
if
end
>
r
.
max
{
return
0
,
fmt
.
Errorf
(
"end of range (%d) above maximum (%d): %s"
,
end
,
r
.
max
,
expr
)
return
0
,
errors
.
New
(
"end of range above maximum: "
+
expr
)
}
if
start
>
end
{
return
0
,
fmt
.
Errorf
(
"beginning of range (%d) beyond end of range (%d): %s"
,
start
,
end
,
expr
)
return
0
,
errors
.
New
(
"beginning of range after end: "
+
expr
)
}
if
step
==
0
{
return
0
,
fmt
.
Errorf
(
"step of range should be a positive number: %s"
,
expr
)
return
0
,
errors
.
New
(
"step cannot be zero: "
+
expr
)
}
return
getBits
(
start
,
end
,
step
)
|
extra
,
nil
...
...
@@ -332,10 +333,10 @@ func parseIntOrName(expr string, names map[string]uint) (uint, error) {
func
mustParseInt
(
expr
string
)
(
uint
,
error
)
{
num
,
err
:=
strconv
.
Atoi
(
expr
)
if
err
!=
nil
{
return
0
,
fmt
.
Errorf
(
"failed to parse int from %s: %s"
,
expr
,
err
)
return
0
,
errors
.
Wrap
(
err
,
"failed to parse number"
)
}
if
num
<
0
{
return
0
,
fmt
.
Errorf
(
"negative number (%d) not allowed: %s"
,
num
,
expr
)
return
0
,
errors
.
New
(
"number must be positive"
)
}
return
uint
(
num
),
nil
...
...
@@ -419,17 +420,16 @@ func parseDescriptor(descriptor string, loc *time.Location) (Schedule, error) {
Dow
:
all
(
dow
),
Location
:
loc
,
},
nil
}
const
every
=
"@every "
if
strings
.
HasPrefix
(
descriptor
,
every
)
{
duration
,
err
:=
time
.
ParseDuration
(
descriptor
[
len
(
every
)
:
])
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to parse duration %s: %s"
,
descriptor
,
err
)
return
nil
,
errors
.
Wrap
(
err
,
"failed to parse duration"
)
}
return
Every
(
duration
),
nil
}
return
nil
,
fmt
.
Errorf
(
"unrecognized descriptor: %s"
,
descriptor
)
return
nil
,
errors
.
New
(
"unrecognized descriptor: "
+
descriptor
)
}
internal/cron/parser_test.go
View file @
43d13a3e
...
...
@@ -255,7 +255,7 @@ func TestNormalizeFields(t *testing.T) {
}
for
_
,
test
:=
range
tests
{
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
test
.
name
,
func
(
*
testing
.
T
)
{
actual
,
err
:=
normalizeFields
(
test
.
input
,
test
.
options
)
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
...
...
@@ -300,7 +300,7 @@ func TestNormalizeFields_Errors(t *testing.T) {
},
}
for
_
,
test
:=
range
tests
{
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
test
.
name
,
func
(
*
testing
.
T
)
{
actual
,
err
:=
normalizeFields
(
test
.
input
,
test
.
options
)
if
err
==
nil
{
t
.
Errorf
(
"expected an error, got none. results: %v"
,
actual
)
...
...
plugin/idp/oauth2/oauth2_test.go
View file @
43d13a3e
...
...
@@ -67,7 +67,7 @@ func TestNewIdentityProvider(t *testing.T) {
},
}
for
_
,
test
:=
range
tests
{
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
test
.
name
,
func
(
*
testing
.
T
)
{
_
,
err
:=
NewIdentityProvider
(
test
.
config
)
assert
.
ErrorContains
(
t
,
err
,
test
.
containsErr
)
})
...
...
test/util/resource_name_test.go
View file @
43d13a3e
...
...
@@ -27,7 +27,7 @@ func TestUIDMatcher(t *testing.T) {
}
for
_
,
test
:=
range
tests
{
t
.
Run
(
test
.
input
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
test
.
input
,
func
(
*
testing
.
T
)
{
result
:=
util
.
UIDMatcher
.
MatchString
(
test
.
input
)
if
result
!=
test
.
expected
{
t
.
Errorf
(
"For input '%s', expected %v but got %v"
,
test
.
input
,
test
.
expected
,
result
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment