manifest_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package server
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "slices"
  7. "testing"
  8. "github.com/ollama/ollama/types/model"
  9. )
  10. func createManifest(t *testing.T, path, name string) {
  11. t.Helper()
  12. p := filepath.Join(path, "manifests", name)
  13. if err := os.MkdirAll(filepath.Dir(p), 0755); err != nil {
  14. t.Fatal(err)
  15. }
  16. f, err := os.Create(p)
  17. if err != nil {
  18. t.Fatal(err)
  19. }
  20. defer f.Close()
  21. if err := json.NewEncoder(f).Encode(ManifestV2{}); err != nil {
  22. t.Fatal(err)
  23. }
  24. }
  25. func TestManifests(t *testing.T) {
  26. cases := map[string][]string{
  27. "empty": {},
  28. "single": {
  29. filepath.Join("host", "namespace", "model", "tag"),
  30. },
  31. "multiple": {
  32. filepath.Join("registry.ollama.ai", "library", "llama3", "latest"),
  33. filepath.Join("registry.ollama.ai", "library", "llama3", "q4_0"),
  34. filepath.Join("registry.ollama.ai", "library", "llama3", "q4_1"),
  35. filepath.Join("registry.ollama.ai", "library", "llama3", "q8_0"),
  36. filepath.Join("registry.ollama.ai", "library", "llama3", "q5_0"),
  37. filepath.Join("registry.ollama.ai", "library", "llama3", "q5_1"),
  38. filepath.Join("registry.ollama.ai", "library", "llama3", "q2_K"),
  39. filepath.Join("registry.ollama.ai", "library", "llama3", "q3_K_S"),
  40. filepath.Join("registry.ollama.ai", "library", "llama3", "q3_K_M"),
  41. filepath.Join("registry.ollama.ai", "library", "llama3", "q3_K_L"),
  42. filepath.Join("registry.ollama.ai", "library", "llama3", "q4_K_S"),
  43. filepath.Join("registry.ollama.ai", "library", "llama3", "q4_K_M"),
  44. filepath.Join("registry.ollama.ai", "library", "llama3", "q5_K_S"),
  45. filepath.Join("registry.ollama.ai", "library", "llama3", "q5_K_M"),
  46. filepath.Join("registry.ollama.ai", "library", "llama3", "q6_K"),
  47. },
  48. "hidden": {
  49. filepath.Join("host", "namespace", "model", "tag"),
  50. filepath.Join("host", "namespace", "model", ".hidden"),
  51. },
  52. }
  53. for n, wants := range cases {
  54. t.Run(n, func(t *testing.T) {
  55. d := t.TempDir()
  56. t.Setenv("OLLAMA_MODELS", d)
  57. for _, want := range wants {
  58. createManifest(t, d, want)
  59. }
  60. ms, err := Manifests()
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. var ns []model.Name
  65. for k := range ms {
  66. ns = append(ns, k)
  67. }
  68. for _, want := range wants {
  69. n := model.ParseNameFromFilepath(want)
  70. if !n.IsValid() && slices.Contains(ns, n) {
  71. t.Errorf("unexpected invalid name: %s", want)
  72. } else if n.IsValid() && !slices.Contains(ns, n) {
  73. t.Errorf("missing valid name: %s", want)
  74. }
  75. }
  76. })
  77. }
  78. }