GoPLS Viewer

Home|gopls/go/vcs/vcs_test.go
1// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package vcs
6
7import (
8    "errors"
9    "io/ioutil"
10    "os"
11    "path"
12    "path/filepath"
13    "reflect"
14    "runtime"
15    "strings"
16    "testing"
17)
18
19// Test that RepoRootForImportPath creates the correct RepoRoot for a given importPath.
20// TODO(cmang): Add tests for SVN and BZR.
21func TestRepoRootForImportPath(t *testing.T) {
22    if runtime.GOOS == "android" {
23        t.Skipf("incomplete source tree on %s"runtime.GOOS)
24    }
25
26    tests := []struct {
27        path string
28        want *RepoRoot
29    }{
30        {
31            "github.com/golang/groupcache",
32            &RepoRoot{
33                VCS:  vcsGit,
34                Repo"https://github.com/golang/groupcache",
35            },
36        },
37        // Unicode letters in directories (issue 18660).
38        {
39            "github.com/user/unicode/испытание",
40            &RepoRoot{
41                VCS:  vcsGit,
42                Repo"https://github.com/user/unicode",
43            },
44        },
45    }
46
47    for _test := range tests {
48        goterr := RepoRootForImportPath(test.pathfalse)
49        if err != nil {
50            t.Errorf("RepoRootForImportPath(%q): %v"test.patherr)
51            continue
52        }
53        want := test.want
54        if got.VCS.Name != want.VCS.Name || got.Repo != want.Repo {
55            t.Errorf("RepoRootForImportPath(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)"test.pathgot.VCSgot.Repowant.VCSwant.Repo)
56        }
57    }
58}
59
60// Test that FromDir correctly inspects a given directory and returns the right VCS and root.
61func TestFromDir(t *testing.T) {
62    tempDirerr := ioutil.TempDir("""vcstest")
63    if err != nil {
64        t.Fatal(err)
65    }
66    defer os.RemoveAll(tempDir)
67
68    for jvcs := range vcsList {
69        dir := filepath.Join(tempDir"example.com"vcs.Name"."+vcs.Cmd)
70        if j&1 == 0 {
71            err := os.MkdirAll(dir0755)
72            if err != nil {
73                t.Fatal(err)
74            }
75        } else {
76            err := os.MkdirAll(filepath.Dir(dir), 0755)
77            if err != nil {
78                t.Fatal(err)
79            }
80            ferr := os.Create(dir)
81            if err != nil {
82                t.Fatal(err)
83            }
84            f.Close()
85        }
86
87        want := RepoRoot{
88            VCS:  vcs,
89            Rootpath.Join("example.com"vcs.Name),
90        }
91        var got RepoRoot
92        got.VCSgot.Rooterr = FromDir(dirtempDir)
93        if err != nil {
94            t.Errorf("FromDir(%q, %q): %v"dirtempDirerr)
95            continue
96        }
97        if got.VCS.Name != want.VCS.Name || got.Root != want.Root {
98            t.Errorf("FromDir(%q, %q) = VCS(%s) Root(%s), want VCS(%s) Root(%s)"dirtempDirgot.VCSgot.Rootwant.VCSwant.Root)
99        }
100    }
101}
102
103var parseMetaGoImportsTests = []struct {
104    in  string
105    out []metaImport
106}{
107    {
108        `<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">`,
109        []metaImport{{"foo/bar""git""https://github.com/rsc/foo/bar"}},
110    },
111    {
112        `<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
113        <meta name="go-import" content="baz/quux git http://github.com/rsc/baz/quux">`,
114        []metaImport{
115            {"foo/bar""git""https://github.com/rsc/foo/bar"},
116            {"baz/quux""git""http://github.com/rsc/baz/quux"},
117        },
118    },
119    {
120        `<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
121        <meta name="go-import" content="foo/bar mod http://github.com/rsc/baz/quux">`,
122        []metaImport{
123            {"foo/bar""git""https://github.com/rsc/foo/bar"},
124        },
125    },
126    {
127        `<meta name="go-import" content="foo/bar mod http://github.com/rsc/baz/quux">
128        <meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">`,
129        []metaImport{
130            {"foo/bar""git""https://github.com/rsc/foo/bar"},
131        },
132    },
133    {
134        `<head>
135        <meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
136        </head>`,
137        []metaImport{{"foo/bar""git""https://github.com/rsc/foo/bar"}},
138    },
139    {
140        `<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
141        <body>`,
142        []metaImport{{"foo/bar""git""https://github.com/rsc/foo/bar"}},
143    },
144    {
145        `<!doctype html><meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">`,
146        []metaImport{{"foo/bar""git""https://github.com/rsc/foo/bar"}},
147    },
148    {
149        // XML doesn't like <div style=position:relative>.
150        `<!doctype html><title>Page Not Found</title><meta name=go-import content="chitin.io/chitin git https://github.com/chitin-io/chitin"><div style=position:relative>DRAFT</div>`,
151        []metaImport{{"chitin.io/chitin""git""https://github.com/chitin-io/chitin"}},
152    },
153    {
154        `<meta name="go-import" content="myitcv.io git https://github.com/myitcv/x">
155            <meta name="go-import" content="myitcv.io/blah2 mod https://raw.githubusercontent.com/myitcv/pubx/master">
156            `,
157        []metaImport{{"myitcv.io""git""https://github.com/myitcv/x"}},
158    },
159}
160
161func TestParseMetaGoImports(t *testing.T) {
162    for itt := range parseMetaGoImportsTests {
163        outerr := parseMetaGoImports(strings.NewReader(tt.in))
164        if err != nil {
165            t.Errorf("test#%d: %v"ierr)
166            continue
167        }
168        if !reflect.DeepEqual(outtt.out) {
169            t.Errorf("test#%d:\n\thave %q\n\twant %q"iouttt.out)
170        }
171    }
172}
173
174func TestValidateRepoRoot(t *testing.T) {
175    tests := []struct {
176        root string
177        ok   bool
178    }{
179        {
180            root"",
181            ok:   false,
182        },
183        {
184            root"http://",
185            ok:   true,
186        },
187        {
188            root"git+ssh://",
189            ok:   true,
190        },
191        {
192            root"http#://",
193            ok:   false,
194        },
195        {
196            root"-config",
197            ok:   false,
198        },
199        {
200            root"-config://",
201            ok:   false,
202        },
203    }
204
205    for _test := range tests {
206        err := validateRepoRoot(test.root)
207        ok := err == nil
208        if ok != test.ok {
209            want := "error"
210            if test.ok {
211                want = "nil"
212            }
213            t.Errorf("validateRepoRoot(%q) = %q, want %s"test.rooterrwant)
214        }
215    }
216}
217
218func TestMatchGoImport(t *testing.T) {
219    tests := []struct {
220        imports []metaImport
221        path    string
222        mi      metaImport
223        err     error
224    }{
225        {
226            imports: []metaImport{
227                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
228            },
229            path"example.com/user/foo",
230            mi:   metaImport{Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
231        },
232        {
233            imports: []metaImport{
234                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
235            },
236            path"example.com/user/foo/",
237            mi:   metaImport{Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
238        },
239        {
240            imports: []metaImport{
241                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
242                {Prefix"example.com/user/fooa"VCS"git"RepoRoot"https://example.com/repo/target"},
243            },
244            path"example.com/user/foo",
245            mi:   metaImport{Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
246        },
247        {
248            imports: []metaImport{
249                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
250                {Prefix"example.com/user/fooa"VCS"git"RepoRoot"https://example.com/repo/target"},
251            },
252            path"example.com/user/fooa",
253            mi:   metaImport{Prefix"example.com/user/fooa"VCS"git"RepoRoot"https://example.com/repo/target"},
254        },
255        {
256            imports: []metaImport{
257                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
258                {Prefix"example.com/user/foo/bar"VCS"git"RepoRoot"https://example.com/repo/target"},
259            },
260            path"example.com/user/foo/bar",
261            err:  errors.New("should not be allowed to create nested repo"),
262        },
263        {
264            imports: []metaImport{
265                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
266                {Prefix"example.com/user/foo/bar"VCS"git"RepoRoot"https://example.com/repo/target"},
267            },
268            path"example.com/user/foo/bar/baz",
269            err:  errors.New("should not be allowed to create nested repo"),
270        },
271        {
272            imports: []metaImport{
273                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
274                {Prefix"example.com/user/foo/bar"VCS"git"RepoRoot"https://example.com/repo/target"},
275            },
276            path"example.com/user/foo/bar/baz/qux",
277            err:  errors.New("should not be allowed to create nested repo"),
278        },
279        {
280            imports: []metaImport{
281                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
282                {Prefix"example.com/user/foo/bar"VCS"git"RepoRoot"https://example.com/repo/target"},
283            },
284            path"example.com/user/foo/bar/baz/",
285            err:  errors.New("should not be allowed to create nested repo"),
286        },
287        {
288            imports: []metaImport{
289                {Prefix"example.com/user/foo"VCS"git"RepoRoot"https://example.com/repo/target"},
290                {Prefix"example.com/user/foo/bar"VCS"git"RepoRoot"https://example.com/repo/target"},
291            },
292            path"example.com",
293            err:  errors.New("pathologically short path"),
294        },
295    }
296
297    for _test := range tests {
298        mierr := matchGoImport(test.importstest.path)
299        if mi != test.mi {
300            t.Errorf("unexpected metaImport; got %v, want %v"mitest.mi)
301        }
302
303        got := err
304        want := test.err
305        if (got == nil) != (want == nil) {
306            t.Errorf("unexpected error; got %v, want %v"gotwant)
307        }
308    }
309}
310
MembersX
TestRepoRootForImportPath.tests
TestRepoRootForImportPath.RangeStmt_939.test
TestRepoRootForImportPath.RangeStmt_939.BlockStmt.want
TestFromDir.RangeStmt_1583.j
TestParseMetaGoImports.RangeStmt_4600.tt
TestParseMetaGoImports.RangeStmt_4600.BlockStmt.out
reflect
runtime
testing
TestMatchGoImport
TestRepoRootForImportPath.t
TestRepoRootForImportPath.RangeStmt_939.BlockStmt.got
TestFromDir.err
TestFromDir.RangeStmt_1583.BlockStmt.dir
TestFromDir.RangeStmt_1583.BlockStmt.want
TestValidateRepoRoot
TestFromDir.tempDir
TestFromDir.RangeStmt_1583.BlockStmt.BlockStmt.f
TestFromDir.RangeStmt_1583.BlockStmt.got
TestValidateRepoRoot.RangeStmt_5250.BlockStmt.err
TestMatchGoImport.t
TestValidateRepoRoot.tests
TestValidateRepoRoot.RangeStmt_5250.test
path
TestFromDir
TestFromDir.t
TestFromDir.RangeStmt_1583.vcs
TestParseMetaGoImports.RangeStmt_4600.i
TestValidateRepoRoot.t
TestMatchGoImport.tests
TestMatchGoImport.RangeStmt_8638.BlockStmt.err
TestMatchGoImport.RangeStmt_8638.BlockStmt.got
TestRepoRootForImportPath
TestFromDir.RangeStmt_1583.BlockStmt.BlockStmt.err
TestParseMetaGoImports
TestParseMetaGoImports.t
TestValidateRepoRoot.RangeStmt_5250.BlockStmt.BlockStmt.want
TestMatchGoImport.RangeStmt_8638.BlockStmt.want
TestParseMetaGoImports.RangeStmt_4600.BlockStmt.err
TestRepoRootForImportPath.RangeStmt_939.BlockStmt.err
TestMatchGoImport.RangeStmt_8638.test
TestMatchGoImport.RangeStmt_8638.BlockStmt.mi
Members
X