modelpath_test.go 3.21 KB
Newer Older
1
2
package server

3
4
5
6
7
8
import (
	"os"
	"path/filepath"
	"testing"

	"github.com/stretchr/testify/assert"
Michael Yang's avatar
lint  
Michael Yang committed
9
	"github.com/stretchr/testify/require"
10
11

	"github.com/ollama/ollama/envconfig"
12
13
14
15
16
)

func TestGetBlobsPath(t *testing.T) {
	// GetBlobsPath expects an actual directory to exist
	dir, err := os.MkdirTemp("", "ollama-test")
Michael Yang's avatar
lint  
Michael Yang committed
17
	require.NoError(t, err)
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
	defer os.RemoveAll(dir)

	tests := []struct {
		name     string
		digest   string
		expected string
		err      error
	}{
		{
			"empty digest",
			"",
			filepath.Join(dir, "blobs"),
			nil,
		},
		{
			"valid with colon",
			"sha256:456402914e838a953e0cf80caa6adbe75383d9e63584a964f504a7bbb8f7aad9",
			filepath.Join(dir, "blobs", "sha256-456402914e838a953e0cf80caa6adbe75383d9e63584a964f504a7bbb8f7aad9"),
			nil,
		},
		{
			"valid with dash",
			"sha256-456402914e838a953e0cf80caa6adbe75383d9e63584a964f504a7bbb8f7aad9",
			filepath.Join(dir, "blobs", "sha256-456402914e838a953e0cf80caa6adbe75383d9e63584a964f504a7bbb8f7aad9"),
			nil,
		},
		{
			"digest too short",
			"sha256-45640291",
			"",
			ErrInvalidDigestFormat,
		},
		{
			"digest too long",
			"sha256-456402914e838a953e0cf80caa6adbe75383d9e63584a964f504a7bbb8f7aad9aaaaaaaaaa",
			"",
			ErrInvalidDigestFormat,
		},
		{
			"digest invalid chars",
			"../sha256-456402914e838a953e0cf80caa6adbe75383d9e63584a964f504a7bbb8f7a",
			"",
			ErrInvalidDigestFormat,
		},
	}
	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			t.Setenv("OLLAMA_MODELS", dir)
66
			envconfig.LoadConfig()
67
68
69

			got, err := GetBlobsPath(tc.digest)

Michael Yang's avatar
lint  
Michael Yang committed
70
			require.ErrorIs(t, tc.err, err, tc.name)
71
72
73
74
			assert.Equal(t, tc.expected, got, tc.name)
		})
	}
}
75
76
77

func TestParseModelPath(t *testing.T) {
	tests := []struct {
Michael Yang's avatar
Michael Yang committed
78
79
80
		name string
		arg  string
		want ModelPath
81
82
83
	}{
		{
			"full path https",
84
			"https://example.com/ns/repo:tag",
85
86
87
88
89
90
91
92
93
			ModelPath{
				ProtocolScheme: "https",
				Registry:       "example.com",
				Namespace:      "ns",
				Repository:     "repo",
				Tag:            "tag",
			},
		},
		{
94
95
			"full path http",
			"http://example.com/ns/repo:tag",
96
97
98
99
100
101
102
103
104
105
			ModelPath{
				ProtocolScheme: "http",
				Registry:       "example.com",
				Namespace:      "ns",
				Repository:     "repo",
				Tag:            "tag",
			},
		},
		{
			"no protocol",
106
			"example.com/ns/repo:tag",
107
108
109
110
111
112
113
114
115
116
			ModelPath{
				ProtocolScheme: "https",
				Registry:       "example.com",
				Namespace:      "ns",
				Repository:     "repo",
				Tag:            "tag",
			},
		},
		{
			"no registry",
117
			"ns/repo:tag",
118
119
120
121
122
123
124
125
126
127
			ModelPath{
				ProtocolScheme: "https",
				Registry:       DefaultRegistry,
				Namespace:      "ns",
				Repository:     "repo",
				Tag:            "tag",
			},
		},
		{
			"no namespace",
128
			"repo:tag",
129
130
131
132
133
134
135
136
137
138
			ModelPath{
				ProtocolScheme: "https",
				Registry:       DefaultRegistry,
				Namespace:      DefaultNamespace,
				Repository:     "repo",
				Tag:            "tag",
			},
		},
		{
			"no tag",
139
			"repo",
140
141
142
143
144
145
146
147
148
149
150
151
			ModelPath{
				ProtocolScheme: "https",
				Registry:       DefaultRegistry,
				Namespace:      DefaultNamespace,
				Repository:     "repo",
				Tag:            DefaultTag,
			},
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
152
			got := ParseModelPath(tc.arg)
153
154
155
156
157
158
159

			if got != tc.want {
				t.Errorf("got: %q want: %q", got, tc.want)
			}
		})
	}
}