114 lines
2.8 KiB
Go
114 lines
2.8 KiB
Go
|
|
package seqlog
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestErrorTypes(t *testing.T) {
|
||
|
|
t.Run("TopicError", func(t *testing.T) {
|
||
|
|
err := NewTopicError("app", "write", ErrNotFound)
|
||
|
|
if err.Error() != "topic app: write: not found" {
|
||
|
|
t.Errorf("unexpected error message: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试 Unwrap
|
||
|
|
if !errors.Is(err, ErrNotFound) {
|
||
|
|
t.Error("expected ErrNotFound")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试 errors.As
|
||
|
|
var topicErr *TopicError
|
||
|
|
if !errors.As(err, &topicErr) {
|
||
|
|
t.Error("expected TopicError")
|
||
|
|
}
|
||
|
|
if topicErr.Topic != "app" {
|
||
|
|
t.Errorf("expected topic 'app', got '%s'", topicErr.Topic)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("FileError", func(t *testing.T) {
|
||
|
|
err := NewFileError("/path/to/file", "open", errors.New("permission denied"))
|
||
|
|
if err.Error() != "file /path/to/file: open: permission denied" {
|
||
|
|
t.Errorf("unexpected error message: %v", err)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("IndexError", func(t *testing.T) {
|
||
|
|
err := NewIndexError(100, 50)
|
||
|
|
if err.Error() != "index 100 out of range [0, 50): invalid index or range" {
|
||
|
|
t.Errorf("unexpected error message: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试 errors.Is
|
||
|
|
if !errors.Is(err, ErrInvalidRange) {
|
||
|
|
t.Error("expected ErrInvalidRange")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试 IsIndexOutOfRange
|
||
|
|
if !IsIndexOutOfRange(err) {
|
||
|
|
t.Error("expected IsIndexOutOfRange to return true")
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("ValidationError", func(t *testing.T) {
|
||
|
|
err := NewValidationError("count", "must be greater than 0", ErrInvalidCount)
|
||
|
|
if err.Error() != "validation error: count: must be greater than 0: count must be greater than 0" {
|
||
|
|
t.Errorf("unexpected error message: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试 errors.Is
|
||
|
|
if !errors.Is(err, ErrInvalidCount) {
|
||
|
|
t.Error("expected ErrInvalidCount")
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("IsTopicNotFound", func(t *testing.T) {
|
||
|
|
err := NewTopicError("app", "get", ErrNotFound)
|
||
|
|
if !IsTopicNotFound(err) {
|
||
|
|
t.Error("expected IsTopicNotFound to return true")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试其他错误
|
||
|
|
if IsTopicNotFound(ErrInvalidCount) {
|
||
|
|
t.Error("expected IsTopicNotFound to return false for ErrInvalidCount")
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("IsCRCMismatch", func(t *testing.T) {
|
||
|
|
if !IsCRCMismatch(ErrCRCMismatch) {
|
||
|
|
t.Error("expected IsCRCMismatch to return true")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试其他错误
|
||
|
|
if IsCRCMismatch(ErrNotFound) {
|
||
|
|
t.Error("expected IsCRCMismatch to return false for ErrNotFound")
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("SentinelErrors", func(t *testing.T) {
|
||
|
|
// 测试所有哨兵错误都不为 nil
|
||
|
|
sentinelErrors := []error{
|
||
|
|
ErrNilParameter,
|
||
|
|
ErrInvalidCount,
|
||
|
|
ErrInvalidRange,
|
||
|
|
ErrAlreadyRunning,
|
||
|
|
ErrNotRunning,
|
||
|
|
ErrAlreadyRegistered,
|
||
|
|
ErrNotFound,
|
||
|
|
ErrCRCMismatch,
|
||
|
|
ErrInvalidUUID,
|
||
|
|
ErrInvalidConfig,
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, err := range sentinelErrors {
|
||
|
|
if err == nil {
|
||
|
|
t.Error("sentinel error should not be nil")
|
||
|
|
}
|
||
|
|
if err.Error() == "" {
|
||
|
|
t.Error("sentinel error should have a message")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|