mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-05-11 02:16:35 +00:00

To help accommodate web browser interactions with websockets, when a streaming logs session is requested for the same actor while already serving a session for that user in a separate request, the original request will be closed and the new request start streaming logs instead. This should help with rogue sessions holding on for too long with no client on the other side (before idle timeout or connection close).
127 lines
2.6 KiB
Go
127 lines
2.6 KiB
Go
package management
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// Validate the active states of the session
|
|
func TestSession_ActiveControl(t *testing.T) {
|
|
_, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
session := newSession(4, actor{}, cancel)
|
|
// session starts out not active
|
|
assert.False(t, session.Active())
|
|
session.active.Store(true)
|
|
assert.True(t, session.Active())
|
|
session.Stop()
|
|
assert.False(t, session.Active())
|
|
}
|
|
|
|
// Validate that the session filters events
|
|
func TestSession_Insert(t *testing.T) {
|
|
_, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
infoLevel := new(LogLevel)
|
|
*infoLevel = Info
|
|
warnLevel := new(LogLevel)
|
|
*warnLevel = Warn
|
|
for _, test := range []struct {
|
|
name string
|
|
filters StreamingFilters
|
|
expectLog bool
|
|
}{
|
|
{
|
|
name: "none",
|
|
expectLog: true,
|
|
},
|
|
{
|
|
name: "level",
|
|
filters: StreamingFilters{
|
|
Level: infoLevel,
|
|
},
|
|
expectLog: true,
|
|
},
|
|
{
|
|
name: "filtered out level",
|
|
filters: StreamingFilters{
|
|
Level: warnLevel,
|
|
},
|
|
expectLog: false,
|
|
},
|
|
{
|
|
name: "events",
|
|
filters: StreamingFilters{
|
|
Events: []LogEventType{HTTP},
|
|
},
|
|
expectLog: true,
|
|
},
|
|
{
|
|
name: "filtered out event",
|
|
filters: StreamingFilters{
|
|
Events: []LogEventType{Cloudflared},
|
|
},
|
|
expectLog: false,
|
|
},
|
|
{
|
|
name: "filter and event",
|
|
filters: StreamingFilters{
|
|
Level: infoLevel,
|
|
Events: []LogEventType{HTTP},
|
|
},
|
|
expectLog: true,
|
|
},
|
|
} {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
session := newSession(4, actor{}, cancel)
|
|
session.Filters(&test.filters)
|
|
log := Log{
|
|
Time: time.Now().UTC().Format(time.RFC3339),
|
|
Event: HTTP,
|
|
Level: Info,
|
|
Message: "test",
|
|
}
|
|
session.Insert(&log)
|
|
select {
|
|
case <-session.listener:
|
|
require.True(t, test.expectLog)
|
|
default:
|
|
require.False(t, test.expectLog)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// Validate that the session has a max amount of events to hold
|
|
func TestSession_InsertOverflow(t *testing.T) {
|
|
_, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
session := newSession(1, actor{}, cancel)
|
|
log := Log{
|
|
Time: time.Now().UTC().Format(time.RFC3339),
|
|
Event: HTTP,
|
|
Level: Info,
|
|
Message: "test",
|
|
}
|
|
// Insert 2 but only max channel size for 1
|
|
session.Insert(&log)
|
|
session.Insert(&log)
|
|
select {
|
|
case <-session.listener:
|
|
// pass
|
|
default:
|
|
require.Fail(t, "expected one log event")
|
|
}
|
|
// Second dequeue should fail
|
|
select {
|
|
case <-session.listener:
|
|
require.Fail(t, "expected no more remaining log events")
|
|
default:
|
|
// pass
|
|
}
|
|
}
|