Skip to content

etcd-io/gofail

Folders and files

NameName
Last commit message
Last commit date
Mar 17, 2025
Mar 8, 2025
May 13, 2024
Nov 16, 2022
Mar 7, 2025
Mar 8, 2025
Aug 19, 2022
Mar 7, 2025
Mar 8, 2025
Aug 8, 2024
Jan 4, 2018
Jun 20, 2016
Sep 16, 2024
Jan 4, 2018
Sep 10, 2024
May 10, 2024
Nov 20, 2022
Feb 12, 2025
Mar 7, 2025
Nov 25, 2024
Jun 19, 2024

Repository files navigation

gofail

Build Status

An implementation of failpoints for golang. Please read design.md for a deeper understanding.

Add a failpoint

Failpoints are special comments that include a failpoint variable declaration and some trigger code,

func someFunc() string {
	// gofail: var SomeFuncString string
	// // this is called when the failpoint is triggered
	// return SomeFuncString
	return "default"
}

Build with failpoints

Building with failpoints will translate gofail comments in place to code that accesses the gofail runtime.

Call gofail in the directory with failpoints to generate gofail runtime bindings, then build as usual,

gofail enable
go build cmd/

The translated code looks something like,

func someFunc() string {
	if vSomeFuncString, __fpErr := __fp_SomeFuncString.Acquire(); __fpErr == nil { SomeFuncString, __fpTypeOK := vSomeFuncString.(string); if !__fpTypeOK { goto __badTypeSomeFuncString} 
		 // this is called when the failpoint is triggered
		 return SomeFuncString; goto __nomockSomeFuncString; __badTypeSomeFuncString: __fp_SomeFuncString.BadType(vSomeFuncString, "string"); __nomockSomeFuncString: };
	return "default"
}

To disable failpoints and revert to the original code,

gofail disable

Triggering a failpoint

After building with failpoints enabled, the program's failpoints can be activated so they may trigger when evaluated.

Command line

From the command line, trigger the failpoint to set SomeFuncString to hello,

GOFAIL_FAILPOINTS='SomeFuncString=return("hello")' ./cmd

Multiple failpoints are set by using ';' for a delimiter,

GOFAIL_FAILPOINTS='failpoint1=return("hello");failpoint2=sleep(10)' ./cmd

HTTP endpoint

First, enable the HTTP server from the command line,

GOFAIL_HTTP="127.0.0.1:1234" ./cmd

Activate a failpoint with curl,

$ curl http://127.0.0.1:1234/SomeFuncString -XPUT -d'return("hello")'

List the failpoints,

$ curl http://127.0.0.1:1234/SomeFuncString=return("hello")

Retrieve the execution count of a failpoint,

$curl http://127.0.0.1:1234/SomeFuncString/count -XGET

Deactivate a failpoint,

$ curl http://127.0.0.1:1234/SomeFuncString -XDELETE

Unit tests

From a unit test,

import (
	"testing"

	gofail "go.etcd.io/gofail/runtime"
)

func TestWhatever(t *testing.T) {
	gofail.Enable("SomeFuncString", `return("hello")`)
	defer gofail.Disable("SomeFuncString")
	...
}