|  | // Copyright 2017 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | package index | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "reflect" | 
|  | "sort" | 
|  | "strings" | 
|  | "testing" | 
|  |  | 
|  | "fuchsia.googlesource.com/pm/pkg" | 
|  | ) | 
|  |  | 
|  | func TestStatic(t *testing.T) { | 
|  | f, err := ioutil.TempFile("", t.Name()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | defer os.Remove(f.Name()) | 
|  |  | 
|  | fmt.Fprintf(f, "a/0=331e2e4b22e61fba85c595529103f957d7fe19731a278853361975d639a1bdd8\n") | 
|  | f.Close() | 
|  |  | 
|  | si, err := LoadStaticIndex(f.Name()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | expectList := []pkg.Package{{Name: "a", Version: "0"}} | 
|  | gotList, err := si.List() | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | if !reflect.DeepEqual(gotList, expectList) { | 
|  | t.Errorf("static.List() %v != %v", gotList, expectList) | 
|  | } | 
|  |  | 
|  | if !si.HasName("a") { | 
|  | t.Error("static.HasName(`a`) = false, want true") | 
|  | } | 
|  |  | 
|  | if si.HasName("b") { | 
|  | t.Error("static.HasName(`b`) = true, want false") | 
|  | } | 
|  |  | 
|  | getPackageCases := []struct { | 
|  | name, version string | 
|  | result        string | 
|  | }{ | 
|  | {"a", "0", "331e2e4b22e61fba85c595529103f957d7fe19731a278853361975d639a1bdd8"}, | 
|  | {"a", "1", ""}, | 
|  | {"b", "0", ""}, | 
|  | } | 
|  | for _, tc := range getPackageCases { | 
|  | if got := si.GetPackage(tc.name, tc.version); got != tc.result { | 
|  | t.Errorf("static.GetPackage(%q, %q) = %q want %q", tc.name, tc.version, got, tc.result) | 
|  | } | 
|  | } | 
|  |  | 
|  | if got, want := si.ListVersions("a"), []string{"0"}; !reflect.DeepEqual(got, want) { | 
|  | t.Errorf("static.ListVersions(`a`) = %v, want %v", got, want) | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | func TestNewDynamic(t *testing.T) { | 
|  | d, err := ioutil.TempDir("", t.Name()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | // assert that a pre-existing directory is fine | 
|  | _, err = NewDynamic(d) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | // assert that a non-existing directory is fine | 
|  | err = os.RemoveAll(d) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | _, err = NewDynamic(d) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | if _, err := os.Stat(d); err != nil { | 
|  | t.Errorf("expected directory to have been created, got %s", err) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestList(t *testing.T) { | 
|  | d, err := ioutil.TempDir("", t.Name()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | pkgIndexPath := filepath.Join(d, "packages", "foo") | 
|  | err = os.MkdirAll(pkgIndexPath, os.ModePerm) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | err = ioutil.WriteFile(filepath.Join(pkgIndexPath, "0"), []byte{}, os.ModePerm) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | idx, err := NewDynamic(d) | 
|  | pkgs, err := idx.List() | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | if got, want := len(pkgs), 1; got != want { | 
|  | t.Errorf("got %d, want %d", got, want) | 
|  | } | 
|  |  | 
|  | if got, want := pkgs[0].Name, "foo"; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | if got, want := pkgs[0].Version, "0"; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  |  | 
|  | pkgIndexPath = filepath.Join(d, "packages", "bar") | 
|  | err = os.MkdirAll(pkgIndexPath, os.ModePerm) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | err = ioutil.WriteFile(filepath.Join(pkgIndexPath, "1"), []byte{}, os.ModePerm) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | pkgs, err = idx.List() | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | if got, want := len(pkgs), 2; got != want { | 
|  | t.Errorf("got %d, want %d", got, want) | 
|  | } | 
|  |  | 
|  | if got, want := pkgs[0].Name, "bar"; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | if got, want := pkgs[0].Version, "1"; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | if got, want := pkgs[1].Name, "foo"; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | if got, want := pkgs[1].Version, "0"; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestAdd(t *testing.T) { | 
|  | d, err := ioutil.TempDir("", t.Name()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | idx, err := NewDynamic(d) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | err = idx.Add(pkg.Package{Name: "foo", Version: "0"}) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | err = idx.Add(pkg.Package{Name: "foo", Version: "1"}) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | err = idx.Add(pkg.Package{Name: "bar", Version: "10"}) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | paths, err := filepath.Glob(filepath.Join(d, "packages/*/*")) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | sort.Strings(paths) | 
|  |  | 
|  | for i := range paths { | 
|  | paths[i] = strings.TrimPrefix(paths[i], filepath.Join(d, "packages")+"/") | 
|  | } | 
|  |  | 
|  | wantPaths := []string{"bar/10", "foo/0", "foo/1"} | 
|  |  | 
|  | for i := range paths { | 
|  | if got, want := paths[i], wantPaths[i]; got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestRemove(t *testing.T) { | 
|  | d, err := ioutil.TempDir("", t.Name()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | idx, err := NewDynamic(d) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | packages := []string{ | 
|  | "bar/10", | 
|  | "foo/1", | 
|  | } | 
|  | for _, p := range packages { | 
|  | err = os.MkdirAll(filepath.Dir(filepath.Join(d, "packages", p)), os.ModePerm) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | err = ioutil.WriteFile(filepath.Join(d, "packages", p), []byte{}, os.ModePerm) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | } | 
|  |  | 
|  | if err := idx.Remove(pkg.Package{Name: "foo", Version: "1"}); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  |  | 
|  | paths, err := filepath.Glob(filepath.Join(d, "packages", "*", "*")) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | sort.Strings(paths) | 
|  |  | 
|  | if got, want := len(paths), 1; got != want { | 
|  | t.Errorf("got %d, want %d", got, want) | 
|  | } | 
|  |  | 
|  | if got, want := paths[0], filepath.Join(d, "packages", packages[0]); got != want { | 
|  | t.Errorf("got %q, want %q", got, want) | 
|  | } | 
|  | } |