Files
frontier/test/e2e/conn_test.go
T
Austin Zhai f420773b0e Feat/container multi os (#98)
* Add comprehensive in-process test framework

Add unit tests for exchange layer, E2E integration tests, security
tests (race + fuzz), and Go benchmark tests replacing the old
shell-script-based bench programs. All tests run in-process without
requiring an external frontier process. Suppress klog and armorigo
log noise in all test files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Update build configs, Dockerfiles and dependencies

Update Makefile with new targets, consolidate frontier_all.yaml config,
bump base image versions in Dockerfiles, and update go.mod/go.sum.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Revert etc/frontier_all.yaml to previous version

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 09:25:47 +08:00

108 lines
2.4 KiB
Go

package e2e
import (
"context"
"net"
"sync"
"testing"
"time"
"github.com/singchia/frontier/api/dataplane/v1/edge"
"github.com/singchia/frontier/api/dataplane/v1/service"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// E2E-CONN-001
func TestEdgeConnect(t *testing.T) {
e := newEdge(t)
assert.NotZero(t, e.EdgeID())
}
// E2E-CONN-002
func TestEdgeConnectAndClose(t *testing.T) {
done := make(chan struct{})
e, err := edge.NewEdge(edgeDialer())
require.NoError(t, err)
go func() {
defer close(done)
e.Close()
}()
waitTimeout(t, done, 3*time.Second)
}
// E2E-CONN-003: Edge carries meta, Service receives it via EdgeOnline callback
func TestEdgeConnectWithMeta(t *testing.T) {
meta := []byte("hello-frontier")
gotMeta := make(chan []byte, 1)
svc := newService(t,
service.OptionServiceName("meta-checker"),
service.OptionServiceReceiveTopics([]string{}),
)
err := svc.RegisterEdgeOnline(context.Background(), func(edgeID uint64, m []byte, addr net.Addr) error {
gotMeta <- m
return nil
})
require.NoError(t, err)
time.Sleep(20 * time.Millisecond)
_ = newEdge(t, edge.OptionEdgeMeta(meta))
select {
case m := <-gotMeta:
assert.Equal(t, meta, m)
case <-time.After(3 * time.Second):
t.Fatal("timed out waiting for EdgeOnline callback")
}
}
// E2E-CONN-004: 100 edges connect concurrently, all succeed with unique IDs
func TestMultiEdgeConnect(t *testing.T) {
const n = 100
ids := make(chan uint64, n)
var wg sync.WaitGroup
wg.Add(n)
for i := 0; i < n; i++ {
go func() {
defer wg.Done()
e := newEdge(t)
ids <- e.EdgeID()
}()
}
wg.Wait()
close(ids)
seen := make(map[uint64]struct{}, n)
for id := range ids {
assert.NotZero(t, id)
_, dup := seen[id]
assert.False(t, dup, "duplicate edgeID: %d", id)
seen[id] = struct{}{}
}
assert.Len(t, seen, n)
}
// E2E-CONN-005: Service connects and registers successfully
func TestServiceConnect(t *testing.T) {
svc := newService(t, service.OptionServiceName("my-service"))
assert.NotNil(t, svc)
}
// E2E-CONN-006: After Service disconnects, Edge RPC call returns an error
func TestServiceConnectAndClose(t *testing.T) {
svc, err := service.NewService(serviceDialer(),
service.OptionServiceName("gone-service"),
)
require.NoError(t, err)
svc.Close()
time.Sleep(50 * time.Millisecond)
e := newEdge(t)
req := e.NewRequest([]byte("ping"))
_, err = e.Call(context.Background(), "anything", req)
assert.Error(t, err)
}