package fileops import ( "math" "os" "path/filepath" "strings" "testing" ) func TestReadFileBoundedEnforcesLimitWithoutPartialContent(t *testing.T) { root := t.TempDir() path := filepath.Join(root, "value.txt") if err := os.WriteFile(path, []byte("12345"), 0o644); err != nil { t.Fatalf("WriteFile() error = %v", err) } data, err := ReadFileBounded(path, 5) if err != nil { t.Fatalf("ReadFileBounded(exact limit) error = %v", err) } if string(data) != "12345" { t.Fatalf("ReadFileBounded(exact limit) = %q, want complete content", data) } data, err = ReadFileBounded(path, 4) if err == nil || !strings.Contains(err.Error(), "4-byte limit") { t.Fatalf("ReadFileBounded(limit plus one) data = %q error = %v, want limit error", data, err) } if data != nil { t.Fatalf("ReadFileBounded(limit plus one) returned partial data %q", data) } } func TestReadFileBoundedHandlesBoundaryLimits(t *testing.T) { root := t.TempDir() emptyPath := filepath.Join(root, "empty.txt") valuePath := filepath.Join(root, "value.txt") if err := os.WriteFile(emptyPath, nil, 0o644); err != nil { t.Fatalf("WriteFile(empty) error = %v", err) } if err := os.WriteFile(valuePath, []byte("value"), 0o644); err != nil { t.Fatalf("WriteFile(value) error = %v", err) } if data, err := ReadFileBounded(emptyPath, 0); err != nil || len(data) != 0 { t.Fatalf("ReadFileBounded(empty, zero) data = %q error = %v", data, err) } if data, err := ReadFileBounded(valuePath, 0); err == nil || data != nil { t.Fatalf("ReadFileBounded(value, zero) data = %q error = %v, want limit error", data, err) } if data, err := ReadFileBounded(valuePath, math.MaxInt64); err != nil || string(data) != "value" { t.Fatalf("ReadFileBounded(max limit) data = %q error = %v", data, err) } if _, err := ReadFileBounded(valuePath, -1); err == nil || !strings.Contains(err.Error(), "invalid") { t.Fatalf("ReadFileBounded(negative limit) error = %v, want invalid limit", err) } if _, err := ReadFileBounded(" ", 1); err == nil || !strings.Contains(err.Error(), "path is required") { t.Fatalf("ReadFileBounded(empty path) error = %v, want required path", err) } }