1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2024-11-01 04:24:19 +00:00
arikawa/utils/bot/ctx_shard_test.go
diamondburned a0bcd77d7e
state: Ignore state errors in API wrappers
This commit makes it so that all API wrapper methods under state will
ignore errors returned from the cabinet setters. This is because an
intermittent error from the state shouldn't shadow the actual result
from the Discord API.
2021-11-25 14:46:45 -08:00

76 lines
1.6 KiB
Go

package bot
import (
"context"
"testing"
"time"
"github.com/diamondburned/arikawa/v3/gateway"
"github.com/diamondburned/arikawa/v3/internal/testenv"
"github.com/diamondburned/arikawa/v3/session/shard"
"github.com/diamondburned/arikawa/v3/state"
)
type shardedBot struct {
Ctx *Context
readyCh chan *gateway.ReadyEvent
}
func (bot *shardedBot) OnReady(r *gateway.ReadyEvent) {
bot.readyCh <- r
}
func TestSharding(t *testing.T) {
env := testenv.Must(t)
data := gateway.DefaultIdentifyCommand("Bot " + env.BotToken)
data.Shard = &gateway.Shard{0, env.ShardCount}
readyCh := make(chan *gateway.ReadyEvent)
newShard := NewShardFunc(func(s *state.State) (*Context, error) {
b, err := New(s, &shardedBot{nil, readyCh})
if err != nil {
return nil, err
}
b.AddIntents(gateway.IntentGuilds)
return b, nil
})
m, err := shard.NewIdentifiedManager(data, newShard)
if err != nil {
t.Fatal("failed to make shard manager:", err)
}
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
go func() {
// Timeout
if err := m.Open(ctx); err != nil {
t.Error("failed to open:", err)
cancel()
}
t.Cleanup(func() {
if err := m.Close(); err != nil {
t.Error("failed to close:", err)
cancel()
}
})
}()
// Expect 4 Ready events.
for i := 0; i < env.ShardCount; i++ {
select {
case ready := <-readyCh:
now := time.Now().Format(time.StampMilli)
t.Log(now, "shard", ready.Shard.ShardID(), "is ready out of", env.ShardCount)
case <-ctx.Done():
t.Fatal("test expired, got", i, "shards")
}
}
}