mirror of
https://github.com/netbirdio/netbird.git
synced 2026-03-31 06:24:18 -04:00
* [client] Add Expose support to embed library Add ability to expose local services via the NetBird reverse proxy from embedded client code. Introduce ExposeSession with a blocking Wait method that keeps the session alive until the context is cancelled. Extract ProtocolType with ParseProtocolType into the expose package and use it across CLI and embed layers. * Fix TestNewRequest assertion to use ProtocolType instead of int * Add documentation for Request and KeepAlive in expose manager * Refactor ExposeSession to pass context explicitly in Wait method * Refactor ExposeSession Wait method to explicitly pass context * Update client/embed/expose.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fix build * Update client/embed/expose.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: Viktor Liu <viktor@netbird.io> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Viktor Liu <17948409+lixmal@users.noreply.github.com>
96 lines
3.0 KiB
Go
96 lines
3.0 KiB
Go
package expose
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
daemonProto "github.com/netbirdio/netbird/client/proto"
|
|
mgm "github.com/netbirdio/netbird/shared/management/client"
|
|
)
|
|
|
|
func TestManager_Expose_Success(t *testing.T) {
|
|
mock := &mgm.MockClient{
|
|
CreateExposeFunc: func(ctx context.Context, req mgm.ExposeRequest) (*mgm.ExposeResponse, error) {
|
|
return &mgm.ExposeResponse{
|
|
ServiceName: "my-service",
|
|
ServiceURL: "https://my-service.example.com",
|
|
Domain: "my-service.example.com",
|
|
}, nil
|
|
},
|
|
}
|
|
|
|
m := NewManager(context.Background(), mock)
|
|
result, err := m.Expose(context.Background(), Request{Port: 8080})
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "my-service", result.ServiceName, "service name should match")
|
|
assert.Equal(t, "https://my-service.example.com", result.ServiceURL, "service URL should match")
|
|
assert.Equal(t, "my-service.example.com", result.Domain, "domain should match")
|
|
}
|
|
|
|
func TestManager_Expose_Error(t *testing.T) {
|
|
mock := &mgm.MockClient{
|
|
CreateExposeFunc: func(ctx context.Context, req mgm.ExposeRequest) (*mgm.ExposeResponse, error) {
|
|
return nil, errors.New("permission denied")
|
|
},
|
|
}
|
|
|
|
m := NewManager(context.Background(), mock)
|
|
_, err := m.Expose(context.Background(), Request{Port: 8080})
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "permission denied", "error should propagate")
|
|
}
|
|
|
|
func TestManager_Renew_Success(t *testing.T) {
|
|
mock := &mgm.MockClient{
|
|
RenewExposeFunc: func(ctx context.Context, domain string) error {
|
|
assert.Equal(t, "my-service.example.com", domain, "domain should be passed through")
|
|
return nil
|
|
},
|
|
}
|
|
|
|
m := NewManager(context.Background(), mock)
|
|
err := m.renew(context.Background(), "my-service.example.com")
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestManager_Renew_Timeout(t *testing.T) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
|
|
mock := &mgm.MockClient{
|
|
RenewExposeFunc: func(ctx context.Context, domain string) error {
|
|
return ctx.Err()
|
|
},
|
|
}
|
|
|
|
m := NewManager(ctx, mock)
|
|
err := m.renew(ctx, "my-service.example.com")
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestNewRequest(t *testing.T) {
|
|
req := &daemonProto.ExposeServiceRequest{
|
|
Port: 8080,
|
|
Protocol: daemonProto.ExposeProtocol_EXPOSE_HTTPS,
|
|
Pin: "123456",
|
|
Password: "secret",
|
|
UserGroups: []string{"group1", "group2"},
|
|
Domain: "custom.example.com",
|
|
NamePrefix: "my-prefix",
|
|
}
|
|
|
|
exposeReq := NewRequest(req)
|
|
|
|
assert.Equal(t, uint16(8080), exposeReq.Port, "port should match")
|
|
assert.Equal(t, ProtocolType(daemonProto.ExposeProtocol_EXPOSE_HTTPS), exposeReq.Protocol, "protocol should match")
|
|
assert.Equal(t, "123456", exposeReq.Pin, "pin should match")
|
|
assert.Equal(t, "secret", exposeReq.Password, "password should match")
|
|
assert.Equal(t, []string{"group1", "group2"}, exposeReq.UserGroups, "user groups should match")
|
|
assert.Equal(t, "custom.example.com", exposeReq.Domain, "domain should match")
|
|
assert.Equal(t, "my-prefix", exposeReq.NamePrefix, "name prefix should match")
|
|
}
|