3cd88debdc
* netxlite: improve docs, tests, and code quality * better documentation * more strict testing of dialer (especially make sure we document the quirk in https://github.com/ooni/probe/issues/1779 and we have tests to guarantee we don't screw up here) * introduce NewErrWrapper factory for creating errors so we have confidence we are creating them correctly Part of https://github.com/ooni/probe/issues/1591
105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
package errorsx
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"io"
|
|
"testing"
|
|
|
|
"github.com/ooni/probe-cli/v3/internal/atomicx"
|
|
)
|
|
|
|
func TestErrWrapper(t *testing.T) {
|
|
t.Run("Error", func(t *testing.T) {
|
|
err := &ErrWrapper{Failure: FailureDNSNXDOMAINError}
|
|
if err.Error() != FailureDNSNXDOMAINError {
|
|
t.Fatal("invalid return value")
|
|
}
|
|
})
|
|
|
|
t.Run("Unwrap", func(t *testing.T) {
|
|
err := &ErrWrapper{
|
|
Failure: FailureEOFError,
|
|
WrappedErr: io.EOF,
|
|
}
|
|
if !errors.Is(err, io.EOF) {
|
|
t.Fatal("cannot unwrap error")
|
|
}
|
|
})
|
|
|
|
t.Run("MarshalJSON", func(t *testing.T) {
|
|
wrappedErr := &ErrWrapper{
|
|
Failure: FailureEOFError,
|
|
WrappedErr: io.EOF,
|
|
}
|
|
data, err := json.Marshal(wrappedErr)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
s := string(data)
|
|
if s != "\""+FailureEOFError+"\"" {
|
|
t.Fatal("invalid serialization", s)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestNewErrWrapper(t *testing.T) {
|
|
t.Run("panics if the classifier is nil", func(t *testing.T) {
|
|
recovered := &atomicx.Int64{}
|
|
func() {
|
|
defer func() {
|
|
if recover() != nil {
|
|
recovered.Add(1)
|
|
}
|
|
}()
|
|
NewErrWrapper(nil, CloseOperation, io.EOF)
|
|
}()
|
|
if recovered.Load() != 1 {
|
|
t.Fatal("did not panic")
|
|
}
|
|
})
|
|
|
|
t.Run("panics if the operation is empty", func(t *testing.T) {
|
|
recovered := &atomicx.Int64{}
|
|
func() {
|
|
defer func() {
|
|
if recover() != nil {
|
|
recovered.Add(1)
|
|
}
|
|
}()
|
|
NewErrWrapper(ClassifyGenericError, "", io.EOF)
|
|
}()
|
|
if recovered.Load() != 1 {
|
|
t.Fatal("did not panic")
|
|
}
|
|
})
|
|
|
|
t.Run("panics if the error is nil", func(t *testing.T) {
|
|
recovered := &atomicx.Int64{}
|
|
func() {
|
|
defer func() {
|
|
if recover() != nil {
|
|
recovered.Add(1)
|
|
}
|
|
}()
|
|
NewErrWrapper(ClassifyGenericError, CloseOperation, nil)
|
|
}()
|
|
if recovered.Load() != 1 {
|
|
t.Fatal("did not panic")
|
|
}
|
|
})
|
|
|
|
t.Run("otherwise, works as intended", func(t *testing.T) {
|
|
ew := NewErrWrapper(ClassifyGenericError, CloseOperation, io.EOF)
|
|
if ew.Failure != FailureEOFError {
|
|
t.Fatal("unexpected failure")
|
|
}
|
|
if ew.Operation != CloseOperation {
|
|
t.Fatal("unexpected operation")
|
|
}
|
|
if ew.WrappedErr != io.EOF {
|
|
t.Fatal("unexpected WrappedErr")
|
|
}
|
|
})
|
|
}
|