gobyexample/examples/fuzzing/calculator_test.go

80 lines
1.8 KiB
Go

package main
/* Fuzz testing or fuzzing is an automated software testing method
that injects invalid, malformed, or unexpected inputs into a system
to reveal software defects and vulnerabilities.
A fuzzing tool injects these inputs into the system and then monitors for exceptions such as crashes or information leakage
*/
//A simple way of using fuzzing to test a program using a claculator instance
import (
"errors"
"fmt"
"testing"
)
/*A calculator for performing simple arithmetic operations*/
func calculator(num1, num2 float64, operator string) (float64, error) {
var result float64
switch operator {
case "-":
result = num1 - num2
case "+":
result = num1 + num2
case "/":
if num2 == 0 || num1 == 0 {
return 0, errors.New("Division by 0")
}
case "*":
result = num1 * num2
}
return result, nil
}
/*Accepts inputs, calls the calculator function and executes inputs and return results*/
func InputCalculator(data float64) float64 {
inputcases := []struct {
input1 float64
input2 float64
operator string
output float64
}{
{1, 3, "+", 4},
{4, 6, "-", -2},
{0, 0, "/", 0},
{9, 2, "*", 18},
{1.2, 2.4, "*", 2.88},
{2, 6, "+", 9},
}
success := 1
for _, input := range inputcases {
result, _ := calculator(input.input1, input.input2, input.operator)
if result != input.output {
fmt.Errorf("Calculator(%f,%f,%s)=%f; expected %f", input.input1, input.input2,
input.operator, result, input.output)
}
return result
}
return float64(success)
}
// testing the Calculator inputs function
func FuzzTestInput(f *testing.F) {
f.Fuzz(func(t *testing.T, data float64) {
_ = InputCalculator(data)
})
}
// Tests the calculator function
func FuzzTestCalculator(f *testing.F) {
f.Fuzz(func(t *testing.T, num1, num2 float64, operator string) {
_, _ = calculator(num1, num2, operator)
})
}