package discovery import ( "os" "path/filepath" "reflect" "testing" ) func TestFindPluginPaths(t *testing.T) { got := findPluginPaths( "foo", []string{ "testdata/current-style-plugins/mockos_mockarch", "testdata/legacy-style-plugins", "testdata/non-existent", "testdata/not-a-dir", }, ) want := []string{ filepath.Join("testdata", "current-style-plugins", "mockos_mockarch", "terraform-foo-bar_v0.0.1"), filepath.Join("testdata", "current-style-plugins", "mockos_mockarch", "terraform-foo-bar_v1.0.0.exe"), // un-versioned plugins are still picked up, even in current-style paths filepath.Join("testdata", "current-style-plugins", "mockos_mockarch", "terraform-foo-missing-version"), filepath.Join("testdata", "legacy-style-plugins", "terraform-foo-bar"), filepath.Join("testdata", "legacy-style-plugins", "terraform-foo-baz"), } // Turn the paths back into relative paths, since we don't care exactly // where this code is present on the system for the sake of this test. baseDir, err := os.Getwd() if err != nil { // Should never happen panic(err) } for i, absPath := range got { if !filepath.IsAbs(absPath) { t.Errorf("got non-absolute path %s", absPath) } got[i], err = filepath.Rel(baseDir, absPath) if err != nil { t.Fatalf("Can't make %s relative to current directory %s", absPath, baseDir) } } if !reflect.DeepEqual(got, want) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, want) } } func TestResolvePluginPaths(t *testing.T) { got := ResolvePluginPaths([]string{ "/example/mockos_mockarch/terraform-foo-bar_v0.0.1", "/example/mockos_mockarch/terraform-foo-baz_v0.0.1", "/example/mockos_mockarch/terraform-foo-baz_v1.0.0", "/example/mockos_mockarch/terraform-foo-baz_v2.0.0_x4", "/example/mockos_mockarch/terraform-foo-upper_V2.0.0_X4", "/example/terraform-foo-bar", "/example/mockos_mockarch/terraform-foo-bar_vbananas", "/example/mockos_mockarch/terraform-foo-bar_v", "/example/mockos_mockarch/terraform-foo-windowsthing1_v1.0.0.exe", "/example/mockos_mockarch/terraform-foo-windowsthing2_v1.0.0_x4.exe", "/example/mockos_mockarch/terraform-foo-windowsthing3.exe", "/example2/mockos_mockarch/terraform-foo-bar_v0.0.1", }) want := []PluginMeta{ { Name: "bar", Version: "0.0.1", Path: "/example/mockos_mockarch/terraform-foo-bar_v0.0.1", }, { Name: "baz", Version: "0.0.1", Path: "/example/mockos_mockarch/terraform-foo-baz_v0.0.1", }, { Name: "baz", Version: "1.0.0", Path: "/example/mockos_mockarch/terraform-foo-baz_v1.0.0", }, { Name: "baz", Version: "2.0.0", Path: "/example/mockos_mockarch/terraform-foo-baz_v2.0.0_x4", }, { Name: "upper", Version: "2.0.0", Path: "/example/mockos_mockarch/terraform-foo-upper_V2.0.0_X4", }, { Name: "bar", Version: "0.0.0", Path: "/example/terraform-foo-bar", }, { Name: "bar", Version: "bananas", Path: "/example/mockos_mockarch/terraform-foo-bar_vbananas", }, { Name: "bar", Version: "", Path: "/example/mockos_mockarch/terraform-foo-bar_v", }, { Name: "windowsthing1", Version: "1.0.0", Path: "/example/mockos_mockarch/terraform-foo-windowsthing1_v1.0.0.exe", }, { Name: "windowsthing2", Version: "1.0.0", Path: "/example/mockos_mockarch/terraform-foo-windowsthing2_v1.0.0_x4.exe", }, { Name: "windowsthing3", Version: "0.0.0", Path: "/example/mockos_mockarch/terraform-foo-windowsthing3.exe", }, } for p := range got { t.Logf("got %#v", p) } if got, want := got.Count(), len(want); got != want { t.Errorf("got %d items; want %d", got, want) } for _, wantMeta := range want { if !got.Has(wantMeta) { t.Errorf("missing meta %#v", wantMeta) } } }