blob: e2df9e4553f14189f3ae00799bf1d2ef8afeee02 [file] [log] [blame]
// 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)
}
}