mirror of
https://github.com/rclone/rclone.git
synced 2025-01-13 20:38:12 +02:00
fs: added weekday schedule into --bwlimit - fixes #1822
This commit is contained in:
parent
8442498693
commit
56e1e82005
@ -279,19 +279,40 @@ For example, to limit bandwidth usage to 10 MBytes/s use `--bwlimit 10M`
|
|||||||
|
|
||||||
It is also possible to specify a "timetable" of limits, which will cause
|
It is also possible to specify a "timetable" of limits, which will cause
|
||||||
certain limits to be applied at certain times. To specify a timetable, format your
|
certain limits to be applied at certain times. To specify a timetable, format your
|
||||||
entries as "HH:MM,BANDWIDTH HH:MM,BANDWIDTH...".
|
entries as "WEEKDAY-HH:MM,BANDWIDTH WEEKDAY-HH:MM,BANDWIDTH..." where:
|
||||||
|
WEEKDAY is optional element.
|
||||||
|
It could be writen as whole world or only using 3 first characters.
|
||||||
|
HH:MM is an hour from 00:00 to 23:59.
|
||||||
|
|
||||||
An example of a typical timetable to avoid link saturation during daytime
|
An example of a typical timetable to avoid link saturation during daytime
|
||||||
working hours could be:
|
working hours could be:
|
||||||
|
|
||||||
`--bwlimit "08:00,512 12:00,10M 13:00,512 18:00,30M 23:00,off"`
|
`--bwlimit "08:00,512 12:00,10M 13:00,512 18:00,30M 23:00,off"`
|
||||||
|
|
||||||
In this example, the transfer bandwidth will be set to 512kBytes/sec at 8am.
|
In this example, the transfer bandwidth will be every day set to 512kBytes/sec at 8am.
|
||||||
At noon, it will raise to 10Mbytes/s, and drop back to 512kBytes/sec at 1pm.
|
At noon, it will raise to 10Mbytes/s, and drop back to 512kBytes/sec at 1pm.
|
||||||
At 6pm, the bandwidth limit will be set to 30MBytes/s, and at 11pm it will be
|
At 6pm, the bandwidth limit will be set to 30MBytes/s, and at 11pm it will be
|
||||||
completely disabled (full speed). Anything between 11pm and 8am will remain
|
completely disabled (full speed). Anything between 11pm and 8am will remain
|
||||||
unlimited.
|
unlimited.
|
||||||
|
|
||||||
|
An example of timetable with WEEKDAY could be:
|
||||||
|
|
||||||
|
`--bwlimit "Mon-00:00,512 Fri-23:59,10M Sat-10:00,1M Sun-20:00,off"`
|
||||||
|
|
||||||
|
It mean that, the transfer bandwidh will be set to 512kBytes/sec on Monday.
|
||||||
|
It will raise to 10Mbytes/s before the end of Friday.
|
||||||
|
At 10:00 on Sunday it will be set to 1Mbyte/s.
|
||||||
|
From 20:00 at Sunday will be unlimited.
|
||||||
|
|
||||||
|
Timeslots without weekday are extended to whole week.
|
||||||
|
So this one example:
|
||||||
|
|
||||||
|
`--bwlimit "Mon-00:00,512 12:00,1M Sun-20:00,off"`
|
||||||
|
|
||||||
|
Is equal to this:
|
||||||
|
|
||||||
|
`--bwlimit "Mon-00:00,512Mon-12:00,1M Tue-12:00,1M Wed-12:00,1M Thu-12:00,1M Fri-12:00,1M Sat-12:00,1M Sun-12:00,1M Sun-20:00,off"`
|
||||||
|
|
||||||
Bandwidth limits only apply to the data transfer. They don't apply to the
|
Bandwidth limits only apply to the data transfer. They don't apply to the
|
||||||
bandwidth of the directory listings etc.
|
bandwidth of the directory listings etc.
|
||||||
|
|
||||||
|
@ -11,8 +11,9 @@ import (
|
|||||||
|
|
||||||
// BwTimeSlot represents a bandwidth configuration at a point in time.
|
// BwTimeSlot represents a bandwidth configuration at a point in time.
|
||||||
type BwTimeSlot struct {
|
type BwTimeSlot struct {
|
||||||
HHMM int
|
DayOfTheWeek int
|
||||||
Bandwidth SizeSuffix
|
HHMM int
|
||||||
|
Bandwidth SizeSuffix
|
||||||
}
|
}
|
||||||
|
|
||||||
// BwTimetable contains all configured time slots.
|
// BwTimetable contains all configured time slots.
|
||||||
@ -22,15 +23,64 @@ type BwTimetable []BwTimeSlot
|
|||||||
func (x BwTimetable) String() string {
|
func (x BwTimetable) String() string {
|
||||||
ret := []string{}
|
ret := []string{}
|
||||||
for _, ts := range x {
|
for _, ts := range x {
|
||||||
ret = append(ret, fmt.Sprintf("%04.4d,%s", ts.HHMM, ts.Bandwidth.String()))
|
ret = append(ret, fmt.Sprintf("%s-%04.4d,%s", time.Weekday(ts.DayOfTheWeek), ts.HHMM, ts.Bandwidth.String()))
|
||||||
}
|
}
|
||||||
return strings.Join(ret, " ")
|
return strings.Join(ret, " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Basic hour format checking
|
||||||
|
func validateHour(HHMM string) error {
|
||||||
|
if len(HHMM) != 5 {
|
||||||
|
return errors.Errorf("invalid time specification (hh:mm): %q", HHMM)
|
||||||
|
}
|
||||||
|
hh, err := strconv.Atoi(HHMM[0:2])
|
||||||
|
if err != nil {
|
||||||
|
return errors.Errorf("invalid hour in time specification %q: %v", HHMM, err)
|
||||||
|
}
|
||||||
|
if hh < 0 || hh > 23 {
|
||||||
|
return errors.Errorf("invalid hour (must be between 00 and 23): %q", hh)
|
||||||
|
}
|
||||||
|
mm, err := strconv.Atoi(HHMM[3:])
|
||||||
|
if err != nil {
|
||||||
|
return errors.Errorf("invalid minute in time specification: %q: %v", HHMM, err)
|
||||||
|
}
|
||||||
|
if mm < 0 || mm > 59 {
|
||||||
|
return errors.Errorf("invalid minute (must be between 00 and 59): %q", hh)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Basic weekday format checking
|
||||||
|
func parseWeekday(dayOfWeek string) (int, error) {
|
||||||
|
dayOfWeek = strings.ToLower(dayOfWeek)
|
||||||
|
if dayOfWeek == "sun" || dayOfWeek == "sunday" {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
if dayOfWeek == "mon" || dayOfWeek == "monday" {
|
||||||
|
return 1, nil
|
||||||
|
}
|
||||||
|
if dayOfWeek == "tue" || dayOfWeek == "tuesday" {
|
||||||
|
return 2, nil
|
||||||
|
}
|
||||||
|
if dayOfWeek == "wed" || dayOfWeek == "wednesday" {
|
||||||
|
return 3, nil
|
||||||
|
}
|
||||||
|
if dayOfWeek == "thu" || dayOfWeek == "thursday" {
|
||||||
|
return 4, nil
|
||||||
|
}
|
||||||
|
if dayOfWeek == "fri" || dayOfWeek == "friday" {
|
||||||
|
return 5, nil
|
||||||
|
}
|
||||||
|
if dayOfWeek == "sat" || dayOfWeek == "saturday" {
|
||||||
|
return 6, nil
|
||||||
|
}
|
||||||
|
return 0, errors.Errorf("invalid weekday: %q", dayOfWeek)
|
||||||
|
}
|
||||||
|
|
||||||
// Set the bandwidth timetable.
|
// Set the bandwidth timetable.
|
||||||
func (x *BwTimetable) Set(s string) error {
|
func (x *BwTimetable) Set(s string) error {
|
||||||
// The timetable is formatted as:
|
// The timetable is formatted as:
|
||||||
// "hh:mm,bandwidth hh:mm,banwidth..." ex: "10:00,10G 11:30,1G 18:00,off"
|
// "dayOfWeek-hh:mm,bandwidth dayOfWeek-hh:mm,banwidth..." ex: "Mon-10:00,10G Mon-11:30,1G Tue-18:00,off"
|
||||||
// If only a single bandwidth identifier is provided, we assume constant bandwidth.
|
// If only a single bandwidth identifier is provided, we assume constant bandwidth.
|
||||||
|
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
@ -42,6 +92,7 @@ func (x *BwTimetable) Set(s string) error {
|
|||||||
if err := ts.Bandwidth.Set(s); err != nil {
|
if err := ts.Bandwidth.Set(s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
ts.DayOfTheWeek = 0
|
||||||
ts.HHMM = 0
|
ts.HHMM = 0
|
||||||
*x = BwTimetable{ts}
|
*x = BwTimetable{ts}
|
||||||
return nil
|
return nil
|
||||||
@ -50,69 +101,100 @@ func (x *BwTimetable) Set(s string) error {
|
|||||||
for _, tok := range strings.Split(s, " ") {
|
for _, tok := range strings.Split(s, " ") {
|
||||||
tv := strings.Split(tok, ",")
|
tv := strings.Split(tok, ",")
|
||||||
|
|
||||||
// Format must be HH:MM,BW
|
// Format must be dayOfWeek-HH:MM,BW
|
||||||
if len(tv) != 2 {
|
if len(tv) != 2 {
|
||||||
return errors.Errorf("invalid time/bandwidth specification: %q", tok)
|
return errors.Errorf("invalid time/bandwidth specification: %q", tok)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Basic timespec sanity checking
|
weekday := 0
|
||||||
HHMM := tv[0]
|
HHMM := ""
|
||||||
if len(HHMM) != 5 {
|
if !strings.Contains(tv[0], "-") {
|
||||||
return errors.Errorf("invalid time specification (hh:mm): %q", HHMM)
|
HHMM = tv[0]
|
||||||
}
|
if err := validateHour(HHMM); err != nil {
|
||||||
hh, err := strconv.Atoi(HHMM[0:2])
|
return err
|
||||||
if err != nil {
|
}
|
||||||
return errors.Errorf("invalid hour in time specification %q: %v", HHMM, err)
|
for i := 0; i < 7; i++ {
|
||||||
}
|
hh, _ := strconv.Atoi(HHMM[0:2])
|
||||||
if hh < 0 || hh > 23 {
|
mm, _ := strconv.Atoi(HHMM[3:])
|
||||||
return errors.Errorf("invalid hour (must be between 00 and 23): %q", hh)
|
ts := BwTimeSlot{
|
||||||
}
|
DayOfTheWeek: i,
|
||||||
mm, err := strconv.Atoi(HHMM[3:])
|
HHMM: (hh * 100) + mm,
|
||||||
if err != nil {
|
}
|
||||||
return errors.Errorf("invalid minute in time specification: %q: %v", HHMM, err)
|
if err := ts.Bandwidth.Set(tv[1]); err != nil {
|
||||||
}
|
return err
|
||||||
if mm < 0 || mm > 59 {
|
}
|
||||||
return errors.Errorf("invalid minute (must be between 00 and 59): %q", hh)
|
*x = append(*x, ts)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
timespec := strings.Split(tv[0], "-")
|
||||||
|
if len(timespec) != 2 {
|
||||||
|
return errors.Errorf("invalid time specification: %q", tv[0])
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
weekday, err = parseWeekday(timespec[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
HHMM = timespec[1]
|
||||||
|
if err := validateHour(HHMM); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
ts := BwTimeSlot{
|
hh, _ := strconv.Atoi(HHMM[0:2])
|
||||||
HHMM: (hh * 100) + mm,
|
mm, _ := strconv.Atoi(HHMM[3:])
|
||||||
|
ts := BwTimeSlot{
|
||||||
|
DayOfTheWeek: weekday,
|
||||||
|
HHMM: (hh * 100) + mm,
|
||||||
|
}
|
||||||
|
// Bandwidth limit for this time slot.
|
||||||
|
if err := ts.Bandwidth.Set(tv[1]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*x = append(*x, ts)
|
||||||
}
|
}
|
||||||
// Bandwidth limit for this time slot.
|
|
||||||
if err := ts.Bandwidth.Set(tv[1]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*x = append(*x, ts)
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Difference in minutes between lateDayOfWeekHHMM and earlyDayOfWeekHHMM
|
||||||
|
func timeDiff(lateDayOfWeekHHMM int, earlyDayOfWeekHHMM int) int {
|
||||||
|
|
||||||
|
lateTimeMinutes := (lateDayOfWeekHHMM / 10000) * 24 * 60
|
||||||
|
lateTimeMinutes += ((lateDayOfWeekHHMM / 100) % 100) * 60
|
||||||
|
lateTimeMinutes += lateDayOfWeekHHMM % 100
|
||||||
|
|
||||||
|
earlyTimeMinutes := (earlyDayOfWeekHHMM / 10000) * 24 * 60
|
||||||
|
earlyTimeMinutes += ((earlyDayOfWeekHHMM / 100) % 100) * 60
|
||||||
|
earlyTimeMinutes += earlyDayOfWeekHHMM % 100
|
||||||
|
|
||||||
|
return lateTimeMinutes - earlyTimeMinutes
|
||||||
|
}
|
||||||
|
|
||||||
// LimitAt returns a BwTimeSlot for the time requested.
|
// LimitAt returns a BwTimeSlot for the time requested.
|
||||||
func (x BwTimetable) LimitAt(tt time.Time) BwTimeSlot {
|
func (x BwTimetable) LimitAt(tt time.Time) BwTimeSlot {
|
||||||
// If the timetable is empty, we return an unlimited BwTimeSlot starting at midnight.
|
// If the timetable is empty, we return an unlimited BwTimeSlot starting at Sunday midnight.
|
||||||
if len(x) == 0 {
|
if len(x) == 0 {
|
||||||
return BwTimeSlot{HHMM: 0, Bandwidth: -1}
|
return BwTimeSlot{DayOfTheWeek: 0, HHMM: 0, Bandwidth: -1}
|
||||||
}
|
}
|
||||||
|
|
||||||
HHMM := tt.Hour()*100 + tt.Minute()
|
dayOfWeekHHMM := int(tt.Weekday())*10000 + tt.Hour()*100 + tt.Minute()
|
||||||
|
|
||||||
// By default, we return the last element in the timetable. This
|
// By default, we return the last element in the timetable. This
|
||||||
// satisfies two conditions: 1) If there's only one element it
|
// satisfies two conditions: 1) If there's only one element it
|
||||||
// will always be selected, and 2) The last element of the table
|
// will always be selected, and 2) The last element of the table
|
||||||
// will "wrap around" until overriden by an earlier time slot.
|
// will "wrap around" until overridden by an earlier time slot.
|
||||||
// there's only one time slot in the timetable.
|
// there's only one time slot in the timetable.
|
||||||
ret := x[len(x)-1]
|
ret := x[len(x)-1]
|
||||||
|
|
||||||
mindif := 0
|
mindif := 0
|
||||||
first := true
|
first := true
|
||||||
|
|
||||||
// Look for most recent time slot.
|
// Look for most recent time slot.
|
||||||
for _, ts := range x {
|
for _, ts := range x {
|
||||||
// Ignore the past
|
// Ignore the past
|
||||||
if HHMM < ts.HHMM {
|
if dayOfWeekHHMM < (ts.DayOfTheWeek*10000)+ts.HHMM {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
dif := ((HHMM / 100 * 60) + (HHMM % 100)) - ((ts.HHMM / 100 * 60) + (ts.HHMM % 100))
|
dif := timeDiff(dayOfWeekHHMM, (ts.DayOfTheWeek*10000)+ts.HHMM)
|
||||||
if first {
|
if first {
|
||||||
mindif = dif
|
mindif = dif
|
||||||
first = false
|
first = false
|
||||||
|
@ -19,25 +19,104 @@ func TestBwTimetableSet(t *testing.T) {
|
|||||||
err bool
|
err bool
|
||||||
}{
|
}{
|
||||||
{"", BwTimetable{}, true},
|
{"", BwTimetable{}, true},
|
||||||
{"0", BwTimetable{BwTimeSlot{HHMM: 0, Bandwidth: 0}}, false},
|
|
||||||
{"666", BwTimetable{BwTimeSlot{HHMM: 0, Bandwidth: 666 * 1024}}, false},
|
|
||||||
{"10:20,666", BwTimetable{BwTimeSlot{HHMM: 1020, Bandwidth: 666 * 1024}}, false},
|
|
||||||
{
|
|
||||||
"11:00,333 13:40,666 23:50,10M 23:59,off",
|
|
||||||
BwTimetable{
|
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
|
||||||
BwTimeSlot{HHMM: 1340, Bandwidth: 666 * 1024},
|
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
|
||||||
BwTimeSlot{HHMM: 2359, Bandwidth: -1},
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{"bad,bad", BwTimetable{}, true},
|
{"bad,bad", BwTimetable{}, true},
|
||||||
{"bad bad", BwTimetable{}, true},
|
{"bad bad", BwTimetable{}, true},
|
||||||
{"bad", BwTimetable{}, true},
|
{"bad", BwTimetable{}, true},
|
||||||
{"1000X", BwTimetable{}, true},
|
{"1000X", BwTimetable{}, true},
|
||||||
{"2401,666", BwTimetable{}, true},
|
{"2401,666", BwTimetable{}, true},
|
||||||
{"1061,666", BwTimetable{}, true},
|
{"1061,666", BwTimetable{}, true},
|
||||||
|
{"bad-10:20,666", BwTimetable{}, true},
|
||||||
|
{"Mon-bad,666", BwTimetable{}, true},
|
||||||
|
{"Mon-10:20,bad", BwTimetable{}, true},
|
||||||
|
{
|
||||||
|
"0",
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 0, Bandwidth: 0},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"666",
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 0, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"10:20,666",
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1020, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"11:00,333 13:40,666 23:50,10M 23:59,off",
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2350, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2359, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2359, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2359, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2359, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2359, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2359, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2359, Bandwidth: -1},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mon-11:00,333 Tue-13:40,666 Fri-00:00,10M Sat-10:00,off Sun-23:00,666",
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 0000, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1000, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2300, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Mon-11:00,333 Tue-13:40,666 Fri-00:00,10M 00:01,off Sun-23:00,666",
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 0000, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2300, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
tt := BwTimetable{}
|
tt := BwTimetable{}
|
||||||
err := tt.Set(test.in)
|
err := tt.Set(test.in)
|
||||||
@ -59,52 +138,189 @@ func TestBwTimetableLimitAt(t *testing.T) {
|
|||||||
{
|
{
|
||||||
BwTimetable{},
|
BwTimetable{},
|
||||||
time.Date(2017, time.April, 20, 15, 0, 0, 0, time.UTC),
|
time.Date(2017, time.April, 20, 15, 0, 0, 0, time.UTC),
|
||||||
BwTimeSlot{HHMM: 0, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 0, Bandwidth: -1},
|
||||||
},
|
|
||||||
{
|
|
||||||
BwTimetable{BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024}},
|
|
||||||
time.Date(2017, time.April, 20, 15, 0, 0, 0, time.UTC),
|
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
BwTimetable{
|
BwTimetable{
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 1300, Bandwidth: 666 * 1024},
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2301, Bandwidth: 1024 * 1024},
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
},
|
||||||
|
time.Date(2017, time.April, 20, 15, 0, 0, 0, time.UTC),
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2350, Bandwidth: -1},
|
||||||
},
|
},
|
||||||
time.Date(2017, time.April, 20, 10, 15, 0, 0, time.UTC),
|
time.Date(2017, time.April, 20, 10, 15, 0, 0, time.UTC),
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2350, Bandwidth: -1},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
BwTimetable{
|
BwTimetable{
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 1300, Bandwidth: 666 * 1024},
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2301, Bandwidth: 1024 * 1024},
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2350, Bandwidth: -1},
|
||||||
},
|
},
|
||||||
time.Date(2017, time.April, 20, 11, 0, 0, 0, time.UTC),
|
time.Date(2017, time.April, 20, 11, 0, 0, 0, time.UTC),
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
BwTimetable{
|
BwTimetable{
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 1300, Bandwidth: 666 * 1024},
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2301, Bandwidth: 1024 * 1024},
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2350, Bandwidth: -1},
|
||||||
},
|
},
|
||||||
time.Date(2017, time.April, 20, 13, 1, 0, 0, time.UTC),
|
time.Date(2017, time.April, 20, 13, 1, 0, 0, time.UTC),
|
||||||
BwTimeSlot{HHMM: 1300, Bandwidth: 666 * 1024},
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
BwTimetable{
|
BwTimetable{
|
||||||
BwTimeSlot{HHMM: 1100, Bandwidth: 333 * 1024},
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 1300, Bandwidth: 666 * 1024},
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2301, Bandwidth: 1024 * 1024},
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1300, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2301, Bandwidth: 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 3, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 2350, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 2350, Bandwidth: -1},
|
||||||
},
|
},
|
||||||
time.Date(2017, time.April, 20, 23, 59, 0, 0, time.UTC),
|
time.Date(2017, time.April, 20, 23, 59, 0, 0, time.UTC),
|
||||||
BwTimeSlot{HHMM: 2350, Bandwidth: -1},
|
BwTimeSlot{DayOfTheWeek: 4, HHMM: 2350, Bandwidth: -1},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 0000, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1000, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2300, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
time.Date(2017, time.April, 20, 23, 59, 0, 0, time.UTC),
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 0000, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1000, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2300, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
time.Date(2017, time.April, 21, 23, 59, 0, 0, time.UTC),
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 0000, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BwTimetable{
|
||||||
|
BwTimeSlot{DayOfTheWeek: 1, HHMM: 1100, Bandwidth: 333 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 2, HHMM: 1340, Bandwidth: 666 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 5, HHMM: 0000, Bandwidth: 10 * 1024 * 1024},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 6, HHMM: 1000, Bandwidth: -1},
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2300, Bandwidth: 666 * 1024},
|
||||||
|
},
|
||||||
|
time.Date(2017, time.April, 17, 10, 59, 0, 0, time.UTC),
|
||||||
|
BwTimeSlot{DayOfTheWeek: 0, HHMM: 2300, Bandwidth: 666 * 1024},
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
slot := test.tt.LimitAt(test.now)
|
slot := test.tt.LimitAt(test.now)
|
||||||
|
Loading…
Reference in New Issue
Block a user