github.com/jdhenke/godel@v0.0.0-20161213181855-abeb3861bf0d/apps/distgo/pkg/imports/imports_test.go (about) 1 // Copyright 2016 Palantir Technologies, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package imports_test 16 17 import ( 18 "io/ioutil" 19 "path" 20 "path/filepath" 21 "testing" 22 "time" 23 24 "github.com/nmiyake/pkg/dirs" 25 "github.com/nmiyake/pkg/gofiles" 26 "github.com/stretchr/testify/assert" 27 "github.com/stretchr/testify/require" 28 29 "github.com/palantir/godel/apps/distgo/pkg/imports" 30 ) 31 32 func TestAllFiles(t *testing.T) { 33 tmpDir, cleanup, err := dirs.TempDir(".", "") 34 defer cleanup() 35 require.NoError(t, err) 36 37 for i, currCase := range []struct { 38 pkgPath string 39 files []gofiles.GoFileSpec 40 want func(projectDir string) imports.GoFiles 41 }{ 42 // returns files for primary package 43 { 44 pkgPath: ".", 45 files: []gofiles.GoFileSpec{ 46 { 47 RelPath: "main.go", 48 Src: `package main; import "fmt"; func main() {}`, 49 }, 50 { 51 RelPath: "main_helper.go", 52 Src: `package main; func Helper() string { return "helper" }`, 53 }, 54 }, 55 want: func(projectDir string) imports.GoFiles { 56 absPkgDir, err := filepath.Abs(projectDir) 57 require.NoError(t, err) 58 return imports.GoFiles(map[string][]string{ 59 absPkgDir: { 60 "main.go", 61 "main_helper.go", 62 }, 63 }) 64 }, 65 }, 66 // test files are excluded 67 { 68 pkgPath: ".", 69 files: []gofiles.GoFileSpec{ 70 { 71 RelPath: "main.go", 72 Src: `package main; import "fmt"; func main() {}`, 73 }, 74 { 75 RelPath: "main_test.go", 76 Src: `package main; import "testing"; func TestMain(t *testing.T) {}`, 77 }, 78 { 79 RelPath: "another_test.go", 80 Src: `package main_test; import "testing"; func TestMain(t *testing.T) {}`, 81 }, 82 }, 83 want: func(projectDir string) imports.GoFiles { 84 absPkgDir, err := filepath.Abs(projectDir) 85 require.NoError(t, err) 86 return imports.GoFiles(map[string][]string{ 87 absPkgDir: { 88 "main.go", 89 }, 90 }) 91 }, 92 }, 93 // returns files for primary package and imported package 94 { 95 pkgPath: ".", 96 files: []gofiles.GoFileSpec{ 97 { 98 RelPath: "main.go", 99 Src: `package main; import "fmt"; import "{{index . "foo/foo.go"}}"; func main() { fmt.Println(foo.Foo()) }`, 100 }, 101 { 102 RelPath: "foo/foo.go", 103 Src: `package foo; func Foo() string { return "foo" }`, 104 }, 105 { 106 RelPath: "foo/foo_helper.go", 107 Src: `package foo`, 108 }, 109 }, 110 want: func(projectDir string) imports.GoFiles { 111 absPkgDir, err := filepath.Abs(projectDir) 112 require.NoError(t, err) 113 return imports.GoFiles(map[string][]string{ 114 absPkgDir: { 115 "main.go", 116 }, 117 path.Join(absPkgDir, "foo"): { 118 "foo.go", 119 "foo_helper.go", 120 }, 121 }) 122 }, 123 }, 124 // returns vendored dependency files 125 { 126 pkgPath: ".", 127 files: []gofiles.GoFileSpec{ 128 { 129 RelPath: "main.go", 130 Src: `package main; import "fmt"; import "github.com/foo"; func main() { fmt.Println(foo.Foo()) }`, 131 }, 132 { 133 RelPath: "vendor/github.com/foo/foo.go", 134 Src: `package foo; func Foo() string { return "foo" }`, 135 }, 136 { 137 RelPath: "vendor/github.com/foo/bar/bar.go", 138 Src: `package bar`, 139 }, 140 }, 141 want: func(projectDir string) imports.GoFiles { 142 absPkgDir, err := filepath.Abs(projectDir) 143 require.NoError(t, err) 144 return imports.GoFiles(map[string][]string{ 145 absPkgDir: { 146 "main.go", 147 }, 148 path.Join(absPkgDir, "vendor/github.com/foo"): { 149 "foo.go", 150 }, 151 }) 152 }, 153 }, 154 } { 155 currProjectDir, err := ioutil.TempDir(tmpDir, "") 156 require.NoError(t, err, "Case %d", i) 157 158 _, err = gofiles.Write(currProjectDir, currCase.files) 159 require.NoError(t, err, "Case %d", i) 160 161 got, err := imports.AllFiles(currProjectDir) 162 require.NoError(t, err, "Case %d", i) 163 assert.Equal(t, currCase.want(currProjectDir), got, "Case %d", i) 164 } 165 } 166 167 func TestNewerThanFileIsNewer(t *testing.T) { 168 tmpDir, cleanup, err := dirs.TempDir(".", "") 169 defer cleanup() 170 require.NoError(t, err) 171 172 tmpFile, err := ioutil.TempFile(tmpDir, "") 173 require.NoError(t, err) 174 fi, err := tmpFile.Stat() 175 require.NoError(t, err) 176 err = tmpFile.Close() 177 require.NoError(t, err) 178 179 // sleep for 1 second to ensure that mtimes differ 180 time.Sleep(time.Second) 181 182 err = ioutil.WriteFile(path.Join(tmpDir, "main.go"), []byte(`package main; import "fmt"; func main() {}`), 0644) 183 require.NoError(t, err) 184 185 goFiles, err := imports.AllFiles(tmpDir) 186 require.NoError(t, err) 187 188 newer, err := goFiles.NewerThan(fi) 189 require.NoError(t, err) 190 assert.True(t, newer) 191 } 192 193 func TestNewerThanFileIsNotNewer(t *testing.T) { 194 tmpDir, cleanup, err := dirs.TempDir(".", "") 195 defer cleanup() 196 require.NoError(t, err) 197 198 err = ioutil.WriteFile(path.Join(tmpDir, "main.go"), []byte(`package main; import "fmt"; func main() {}`), 0644) 199 require.NoError(t, err) 200 201 goFiles, err := imports.AllFiles(tmpDir) 202 require.NoError(t, err) 203 204 // sleep for 1 second to ensure that mtimes differ 205 time.Sleep(time.Second) 206 207 tmpFile, err := ioutil.TempFile(tmpDir, "") 208 require.NoError(t, err) 209 fi, err := tmpFile.Stat() 210 require.NoError(t, err) 211 err = tmpFile.Close() 212 require.NoError(t, err) 213 214 newer, err := goFiles.NewerThan(fi) 215 require.NoError(t, err) 216 assert.False(t, newer) 217 }