github.com/golang/dep@v0.5.4/internal/importers/glide/importer_test.go (about)

     1  // Copyright 2016 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 glide
     6  
     7  import (
     8  	"bytes"
     9  	"log"
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	"github.com/golang/dep"
    14  	"github.com/golang/dep/gps"
    15  	"github.com/golang/dep/internal/importers/importertest"
    16  	"github.com/golang/dep/internal/test"
    17  	"github.com/pkg/errors"
    18  )
    19  
    20  func TestGlideConfig_Convert(t *testing.T) {
    21  	testCases := map[string]struct {
    22  		yaml glideYaml
    23  		lock glideLock
    24  		importertest.TestCase
    25  	}{
    26  		"project": {
    27  			glideYaml{
    28  				Imports: []glidePackage{
    29  					{
    30  						Name:       importertest.Project,
    31  						Repository: importertest.ProjectSrc,
    32  						Reference:  importertest.V2Branch,
    33  					},
    34  				},
    35  			},
    36  			glideLock{
    37  				Imports: []glideLockedPackage{
    38  					{
    39  						Name:       importertest.Project,
    40  						Repository: importertest.ProjectSrc,
    41  						Revision:   importertest.V2PatchRev,
    42  					},
    43  				},
    44  			},
    45  			importertest.TestCase{
    46  				WantSourceRepo: importertest.ProjectSrc,
    47  				WantConstraint: importertest.V2Branch,
    48  				WantRevision:   importertest.V2PatchRev,
    49  				WantVersion:    importertest.V2PatchTag,
    50  			},
    51  		},
    52  		"test project": {
    53  			glideYaml{
    54  				Imports: []glidePackage{
    55  					{
    56  						Name:       importertest.Project,
    57  						Repository: importertest.ProjectSrc,
    58  						Reference:  importertest.V2Branch,
    59  					},
    60  				},
    61  			},
    62  			glideLock{
    63  				Imports: []glideLockedPackage{
    64  					{
    65  						Name:       importertest.Project,
    66  						Repository: importertest.ProjectSrc,
    67  						Revision:   importertest.V2PatchRev,
    68  					},
    69  				},
    70  			},
    71  			importertest.TestCase{
    72  				WantSourceRepo: importertest.ProjectSrc,
    73  				WantConstraint: importertest.V2Branch,
    74  				WantRevision:   importertest.V2PatchRev,
    75  				WantVersion:    importertest.V2PatchTag,
    76  			},
    77  		},
    78  		"yaml only": {
    79  			glideYaml{
    80  				Imports: []glidePackage{
    81  					{
    82  						Name:       importertest.Project,
    83  						Repository: importertest.ProjectSrc,
    84  						Reference:  importertest.V2Branch,
    85  					},
    86  				},
    87  			},
    88  			glideLock{},
    89  			importertest.TestCase{
    90  				WantSourceRepo: importertest.ProjectSrc,
    91  				WantConstraint: importertest.V2Branch,
    92  			},
    93  		},
    94  		"ignored package": {
    95  			glideYaml{
    96  				Ignores: []string{importertest.Project},
    97  			},
    98  			glideLock{},
    99  			importertest.TestCase{
   100  				WantIgnored: []string{importertest.Project},
   101  			},
   102  		},
   103  		"exclude dir": {
   104  			glideYaml{
   105  				ExcludeDirs: []string{"samples"},
   106  			},
   107  			glideLock{},
   108  			importertest.TestCase{
   109  				WantIgnored: []string{importertest.RootProject + "/samples"},
   110  			},
   111  		},
   112  		"exclude dir ignores mismatched package name": {
   113  			glideYaml{
   114  				Name:        "github.com/golang/mismatched-package-name",
   115  				ExcludeDirs: []string{"samples"},
   116  			},
   117  			glideLock{},
   118  			importertest.TestCase{
   119  				WantIgnored: []string{importertest.RootProject + "/samples"},
   120  			},
   121  		},
   122  		"missing package name": {
   123  			glideYaml{
   124  				Imports: []glidePackage{{Name: ""}},
   125  			},
   126  			glideLock{},
   127  			importertest.TestCase{
   128  				WantWarning: "Warning: Skipping project. Invalid glide configuration, Name is required",
   129  			},
   130  		},
   131  		"warn unused os field": {
   132  			glideYaml{
   133  				Imports: []glidePackage{
   134  					{
   135  						Name: importertest.Project,
   136  						OS:   "windows",
   137  					},
   138  				}},
   139  			glideLock{},
   140  			importertest.TestCase{
   141  				WantWarning: "specified an os",
   142  			},
   143  		},
   144  		"warn unused arch field": {
   145  			glideYaml{
   146  				Imports: []glidePackage{
   147  					{
   148  						Name: importertest.Project,
   149  						Arch: "i686",
   150  					},
   151  				}},
   152  			glideLock{},
   153  			importertest.TestCase{
   154  				WantWarning: "specified an arch",
   155  			},
   156  		},
   157  	}
   158  
   159  	for name, testCase := range testCases {
   160  		name := name
   161  		testCase := testCase
   162  		t.Run(name, func(t *testing.T) {
   163  			err := testCase.Execute(t, func(logger *log.Logger, sm gps.SourceManager) (*dep.Manifest, *dep.Lock) {
   164  				g := NewImporter(logger, true, sm)
   165  				g.glideConfig = testCase.yaml
   166  				g.glideLock = testCase.lock
   167  				return g.convert(importertest.RootProject)
   168  			})
   169  			if err != nil {
   170  				t.Fatalf("%#v", err)
   171  			}
   172  		})
   173  	}
   174  }
   175  
   176  func TestGlideConfig_Import(t *testing.T) {
   177  	h := test.NewHelper(t)
   178  	defer h.Cleanup()
   179  
   180  	ctx := importertest.NewTestContext(h)
   181  	sm, err := ctx.SourceManager()
   182  	h.Must(err)
   183  	defer sm.Release()
   184  
   185  	h.TempDir(filepath.Join("src", importertest.RootProject))
   186  	h.TempCopy(filepath.Join(importertest.RootProject, glideYamlName), "glide.yaml")
   187  	h.TempCopy(filepath.Join(importertest.RootProject, glideLockName), "glide.lock")
   188  	projectRoot := h.Path(importertest.RootProject)
   189  
   190  	// Capture stderr so we can verify output
   191  	verboseOutput := &bytes.Buffer{}
   192  	ctx.Err = log.New(verboseOutput, "", 0)
   193  
   194  	g := NewImporter(ctx.Err, false, sm) // Disable verbose so that we don't print values that change each test run
   195  	if !g.HasDepMetadata(projectRoot) {
   196  		t.Fatal("Expected the importer to detect the glide configuration files")
   197  	}
   198  
   199  	m, l, err := g.Import(projectRoot, importertest.RootProject)
   200  	h.Must(err)
   201  
   202  	if m == nil {
   203  		t.Fatal("Expected the manifest to be generated")
   204  	}
   205  
   206  	if l == nil {
   207  		t.Fatal("Expected the lock to be generated")
   208  	}
   209  
   210  	goldenFile := "golden.txt"
   211  	got := verboseOutput.String()
   212  	want := h.GetTestFileString(goldenFile)
   213  	if want != got {
   214  		if *test.UpdateGolden {
   215  			if err := h.WriteTestFile(goldenFile, got); err != nil {
   216  				t.Fatalf("%+v", errors.Wrapf(err, "Unable to write updated golden file %s", goldenFile))
   217  			}
   218  		} else {
   219  			t.Fatalf("want %s, got %s", want, got)
   220  		}
   221  	}
   222  }