
Go के लिए फॉल्ट-इंजेक्शन लाइब्रेरी जो एनवायरनमेंट वेरिएबल्स के माध्यम से पैनिक्स, स्लीप्स, रिटर्न्स और कंडीशनल एरर पाथ को ट्रिगर करने के लिए रनटाइम-नियंत्रणीय फेलपॉइंट्स जोड़ती है।
Golang के लिए failpoints का एक कार्यान्वयन। फेल पॉइंट्स (fail points) का उपयोग कोड पॉइंट्स जोड़ने के लिए किया जाता है जहाँ त्रुटियाँ उपयोगकर्ता-नियंत्रित तरीके से इंजेक्ट की जा सकती हैं। फेल पॉइंट एक कोड स्निपेट है जो केवल तब निष्पादित होता है जब संबंधित failpoint सक्रिय हो।
failpoint-ctl)failpoint-ctl को सोर्स से बनाएँ
git clone https://github.com/pingcap/failpoint.git
cd failpoint
make
ls bin/failpoint-ctl
अपने प्रोग्राम में failpoints इंजेक्ट करें, उदा.:
package main
import "github.com/pingcap/failpoint"
func main() {
failpoint.Inject("testPanic", func() {
panic("failpoint triggerd")
})
}
अपने कोड को failpoint-ctl enable के साथ रूपांतरित करें
go build के साथ बनाएँ
GO_FAILPOINTS पर्यावरण चर के साथ failpoints सक्षम करें
GO_FAILPOINTS="main/testPanic=return(true)" ./your-program
नोट: GO_FAILPOINTS InjectCall प्रकार के मार्कर के साथ काम नहीं करता है।
यदि आप परीक्षण चलाने के लिए go run का उपयोग करते हैं, तो अपने कमांड में जनरेट की गई binding__failpoint_binding__.go को जोड़ना न भूलें, जैसे:
GO_FAILPOINTS="main/testPanic=return(true)" go run your-program.go binding__failpoint_binding__.go
failpoint-toolexec)failpoint-toolexec को सोर्स से बनाएँ
git clone https://github.com/pingcap/failpoint.git
cd failpoint
make
ls bin/failpoint-toolexec
अपने प्रोग्राम में failpoints इंजेक्ट करें, उदा.:
package main
import "github.com/pingcap/failpoint"
func main() {
failpoint.Inject("testPanic", func() {
panic("failpoint triggerd")
})
}
failpoint-toolexec के बिना कैश मिश्रण से बचने के लिए एक अलग बिल्ड कैश का उपयोग करें, और बनाएँ
GOCACHE=/tmp/failpoint-cache go build -toolexec path/to/failpoint-toolexec
GO_FAILPOINTS पर्यावरण चर के साथ failpoints सक्षम करें
GO_FAILPOINTS="main/testPanic=return(true)" ./your-program
आप go run या go test का भी उपयोग कर सकते हैं, जैसे:
GOCACHE=/tmp/failpoint-cache GO_FAILPOINTS="main/testPanic=return(true)" go run -toolexec path/to/failpoint-toolexec your-program.go
Failpoint को मान्य Golang कोड में परिभाषित करें, टिप्पणियों या किसी और चीज़ में नहीं
Failpoint की कोई अतिरिक्त लागत नहीं होती
Failpoint रूटीन लिखने/पढ़ने योग्य है और कंपाइलर द्वारा जाँचा जाना चाहिए
Failpoint परिभाषा द्वारा जनरेट किया गया कोड पढ़ने में आसान है
इंजेक्टिंग कोड के साथ लाइन नंबर समान रखें (डिबग करना आसान)
context.Context के साथ समानांतर परीक्षणों का समर्थन करें
Failpoint
फेलपॉइंट एक कोड स्निपेट है जो केवल तब निष्पादित होता है जब संबंधित failpoint सक्रिय हो।
यदि failpoint.Disable("failpoint-name-for-demo") निष्पादित किया जाता है तो क्लोज़र कभी निष्पादित नहीं होगा।
var outerVar = "declare in outer scope"
failpoint.Inject("failpoint-name-for-demo", func(val failpoint.Value) {
fmt.Println("unit-test", val, outerVar)
})
Marker functions
यह सिर्फ एक खाली फ़ंक्शन है
यह लिखना/पढ़ना आसान है
Failpoints के लिए एक कंपाइलर जाँच प्रस्तुत करता है जो failpoint कोड अमान्य होने पर नियमित मोड में संकलित नहीं हो सकता
Marker funtion list
func Inject(fpname string, fpblock func(val Value)) {}func InjectContext(fpname string, ctx context.Context, fpblock func(val Value)) {}func InjectCall(fpname string, args ...any) {}func Break(label ...string) {}func Goto(label string) {}func Continue(label ...string) {}func Fallthrough() {}func Return(results ...interface{}) {}func Label(label string) {}Supported failpoint environment variable
failpoint को निम्न पैटर्न वाले निर्यात पर्यावरण चर द्वारा सक्षम किया जा सकता है, जो freebsd failpoint SYSCTL VARIABLES के समान है।
नोट: InjectCall को पर्यावरण चर द्वारा सक्षम नहीं किया जा सकता।
[<percent>%][<count>*]<type>[(args...)][-><more terms>]
तर्क निर्दिष्ट करता है कि कौन सी क्रिया करनी है; यह निम्न में से एक हो सकता है:
आप कॉल साइट पर failpoint इंजेक्ट करने के लिए failpoint.Inject को कॉल कर सकते हैं, जहाँ failpoint-name failpoint को ट्रिगर करने के लिए उपयोग किया जाता है और failpoint-closure को IF स्टेटमेंट के बॉडी के रूप में विस्तारित किया जाएगा।
failpoint.Inject("failpoint-name", func(val failpoint.Value) {
failpoint.Return("unit-test", val)
})
परिवर्तित कोड इस प्रकार दिखता है:
if val, _err_ := failpoint.Eval(_curpkg_("failpoint-name")); _err_ == nil {
return "unit-test", val
}
failpoint.Value वह मान है जो failpoint.Enable("failpoint-name", "return(5)") द्वारा पारित किया जाता है, जिसे अनदेखा किया जा सकता है।
failpoint.Inject("failpoint-name", func(_ failpoint.Value) {
fmt.Println("unit-test")
})
OR
failpoint.Inject("failpoint-name", func() {
fmt.Println("unit-test")
})
और परिवर्तित कोड इस प्रकार दिखता है:
if _, _err_ := failpoint.Eval(_curpkg_("failpoint-name")); _err_ == nil {
fmt.Println("unit-test")
}
इसके अलावा, failpoint क्लोज़र एक फ़ंक्शन हो सकता है जो context.Context लेता है। आप context.Context के साथ कुछ अनुकूलित चीज़ें कर सकते हैं जैसे नियंत्रित करना कि समानांतर परीक्षणों या अन्य मामलों में failpoint सक्रिय है या नहीं। उदाहरण के लिए,
failpoint.InjectContext(ctx, "failpoint-name", func(val failpoint.Value) {
fmt.Println("unit-test", val)
})
परिवर्तित कोड इस प्रकार दिखता है:
if val, _err_ := failpoint.EvalContext(ctx, _curpkg_("failpoint-name")); _err_ == nil {
fmt.Println("unit-test", val)
}