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

  1. Use a different RPC factory implementation (e.g. the real service factory) for HTTP frontend client tests.
  2. Rewrite the test to use CreateLocalFrontendGRPCConnection and the gRPC frontend client instead of HTTP.
  3. 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

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


AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01). Data as JSON: /api/errors/fb4e24fce1d3a6aa. Report an issue: GitHub.