temporalio/temporal · error
unimplemented in the nettest package
Error message
unimplemented in the nettest package
What it means
The nettest RPCFactory is a lightweight in-memory factory for integration tests; it implements gRPC connection creation but deliberately panics on CreateLocalFrontendHTTPClient, since HTTP frontend clients are unimplemented in this package. Hitting the panic means calling an API this factory does not support.
Source
Thrown at common/testing/nettest/rpc_factory.go:50
func (f *RPCFactory) GetInternodeGRPCServerOptions() ([]grpc.ServerOption, error) {
return nil, nil
}
func (f *RPCFactory) GetGRPCListener() net.Listener {
return f.listener
}
func (f *RPCFactory) CreateRemoteFrontendGRPCConnection(rpcAddress string) *grpc.ClientConn {
return f.dial(rpcAddress)
}
func (f *RPCFactory) CreateLocalFrontendGRPCConnection() *grpc.ClientConn {
return f.dial(f.listener.Addr().String())
}
func (f *RPCFactory) CreateLocalFrontendHTTPClient() (*common.FrontendHTTPClient, error) {
panic("unimplemented in the nettest package")
}
func (f *RPCFactory) CreateHistoryGRPCConnection(rpcAddress string) *grpc.ClientConn {
return f.dial(rpcAddress)
}
func (f *RPCFactory) CreateMatchingGRPCConnection(rpcAddress string) *grpc.ClientConn {
return f.dial(rpcAddress)
}
func (f *RPCFactory) dial(rpcAddress string) *grpc.ClientConn {
dialOptions := append(f.dialOptions,
grpc.WithContextDialer(func(ctx context.Context, s string) (net.Conn, error) {
return f.listener.Connect(ctx.Done())
}),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
conn, err := grpc.NewClient(View on GitHub (pinned to bde624efd1)
Solutions
- Use a different RPC factory implementation (e.g. the real service factory) for HTTP frontend client tests.
- Rewrite the test to use CreateLocalFrontendGRPCConnection and the gRPC frontend client instead of HTTP.
- Implement CreateLocalFrontendHTTPClient in nettest if HTTP support is genuinely required (contribute the change).
Example fix
// before client, err := rpcFactory.CreateLocalFrontendHTTPClient() // after conn := rpcFactory.CreateLocalFrontendGRPCConnection() client := frontendv1.NewWorkflowServiceClient(conn)
Defensive patterns
Strategy: validation
Validate before calling
var f interface{ CreateLocalFrontendHTTPClient() (*common.FrontendHTTPClient, error) } = rpcFactory
_ = f // only call if factory actually supports HTTP; nettest does not Type guard
func supportsHTTPClient(f interface{}) bool {
type httpFactory interface{ CreateLocalFrontendHTTPClient() (*common.FrontendHTTPClient, error) }
_, ok := f.(httpFactory)
return ok && !isNettestFactory(f) // nettest implements it but panics
} Prevention
- Check which factory implementation a test harness provides before using HTTP clients.
- Prefer the gRPC connection APIs when using nettest.
When it happens
Trigger: Calling CreateLocalFrontendHTTPClient() on common/testing/nettest.RPCFactory — typically a test exercising the Temporal frontend over HTTP with the nettest factory.
Common situations: Tests extended to cover the frontend HTTP API while reusing the nettest factory; accidentally wiring nettest.RPCFactory where a real/other factory supporting HTTP is expected.
Related errors
- panic(err)
- bucket not found
- missing RespondWorkflowTaskCompletedRequest return
- history is nil
- history events are empty
AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01).
Data as JSON: /api/errors/fb4e24fce1d3a6aa.
Report an issue: GitHub.