github.com/jd-ly/tools@v0.5.7/go/vcs/vcs_test.go (about)

     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  
     5  package vcs
     6  
     7  import (
     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.
    21  func 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  		got, err := RepoRootForImportPath(test.path, false)
    49  		if err != nil {
    50  			t.Errorf("RepoRootForImportPath(%q): %v", test.path, err)
    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.path, got.VCS, got.Repo, want.VCS, want.Repo)
    56  		}
    57  	}
    58  }
    59  
    60  // Test that FromDir correctly inspects a given directory and returns the right VCS and root.
    61  func TestFromDir(t *testing.T) {
    62  	tempDir, err := ioutil.TempDir("", "vcstest")
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	defer os.RemoveAll(tempDir)
    67  
    68  	for j, vcs := range vcsList {
    69  		dir := filepath.Join(tempDir, "example.com", vcs.Name, "."+vcs.Cmd)
    70  		if j&1 == 0 {
    71  			err := os.MkdirAll(dir, 0755)
    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  			f, err := os.Create(dir)
    81  			if err != nil {
    82  				t.Fatal(err)
    83  			}
    84  			f.Close()
    85  		}
    86  
    87  		want := RepoRoot{
    88  			VCS:  vcs,
    89  			Root: path.Join("example.com", vcs.Name),
    90  		}
    91  		var got RepoRoot
    92  		got.VCS, got.Root, err = FromDir(dir, tempDir)
    93  		if err != nil {
    94  			t.Errorf("FromDir(%q, %q): %v", dir, tempDir, err)
    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)", dir, tempDir, got.VCS, got.Root, want.VCS, want.Root)
    99  		}
   100  	}
   101  }
   102  
   103  var 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  
   161  func TestParseMetaGoImports(t *testing.T) {
   162  	for i, tt := range parseMetaGoImportsTests {
   163  		out, err := parseMetaGoImports(strings.NewReader(tt.in))
   164  		if err != nil {
   165  			t.Errorf("test#%d: %v", i, err)
   166  			continue
   167  		}
   168  		if !reflect.DeepEqual(out, tt.out) {
   169  			t.Errorf("test#%d:\n\thave %q\n\twant %q", i, out, tt.out)
   170  		}
   171  	}
   172  }
   173  
   174  func 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.root, err, want)
   214  		}
   215  	}
   216  }
   217  
   218  func 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  		mi, err := matchGoImport(test.imports, test.path)
   299  		if mi != test.mi {
   300  			t.Errorf("unexpected metaImport; got %v, want %v", mi, test.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", got, want)
   307  		}
   308  	}
   309  }