blob: 16f4f725e157c29f10066ea63ff3feff166db971 [file] [log] [blame]
// Copyright 2015 The Vanadium 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 main
import (
"fmt"
"io/ioutil"
"os"
"strings"
"testing"
"v.io/jiri"
"v.io/x/lib/gosh"
)
type upgradeTestCase struct {
Args []string
Exist bool
Local, Want string
Stderr string
}
func TestUpgrade(t *testing.T) {
tests := []upgradeTestCase{
{
Stderr: `must specify upgrade kind`,
},
{
Args: []string{"foo"},
Stderr: `unknown upgrade kind "foo"`,
},
// Test v23 upgrades.
{
Args: []string{"v23"},
Exist: true,
Stderr: `.jiri_manifest already exists`,
},
{
Args: []string{"v23"},
Want: `<manifest>
<imports>
<import manifest="public" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
</imports>
</manifest>
`,
},
{
Args: []string{"v23"},
Local: `<manifest>
<imports>
<import name="default"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="public" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
</imports>
</manifest>
`,
},
{
Args: []string{"v23"},
Local: `<manifest>
<imports>
<import name="private"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="private" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
</imports>
</manifest>
`,
},
{
Args: []string{"v23"},
Local: `<manifest>
<imports>
<import name="private"/>
<import name="infrastructure"/>
<import name="default"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="private" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
<import manifest="infrastructure" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
<import manifest="public" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
</imports>
</manifest>
`,
},
{
Args: []string{"v23"},
Local: `<manifest>
<imports>
<import name="default"/>
<import name="infrastructure"/>
<import name="private"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="public" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
<import manifest="infrastructure" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
<import manifest="private" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
</imports>
</manifest>
`,
},
// Test fuchsia upgrades.
{
Args: []string{"fuchsia"},
Exist: true,
Stderr: `.jiri_manifest already exists`,
},
{
Args: []string{"fuchsia"},
Want: `<manifest>
<imports>
<import manifest="manifest/fuchsia" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
</imports>
</manifest>
`,
},
{
Args: []string{"fuchsia"},
Local: `<manifest>
<imports>
<import name="default"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="manifest/fuchsia" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
</imports>
</manifest>
`,
},
{
Args: []string{"fuchsia"},
Local: `<manifest>
<imports>
<import name="private"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="private" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
</imports>
</manifest>
`,
},
{
Args: []string{"fuchsia"},
Local: `<manifest>
<imports>
<import name="private"/>
<import name="infrastructure"/>
<import name="default"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="private" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
<import manifest="infrastructure" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
<import manifest="manifest/fuchsia" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
</imports>
</manifest>
`,
},
{
Args: []string{"fuchsia"},
Local: `<manifest>
<imports>
<import name="default"/>
<import name="infrastructure"/>
<import name="private"/>
</imports>
</manifest>
`,
Want: `<manifest>
<imports>
<import manifest="manifest/fuchsia" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
<import manifest="infrastructure" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
<import manifest="private" name="fnl-start" remote="https://fuchsia.googlesource.com/fnl-start"/>
</imports>
</manifest>
`,
},
}
sh := gosh.NewShell(t)
defer sh.Cleanup()
jiriTool := gosh.BuildGoPkg(sh, sh.MakeTempDir(), "v.io/jiri/cmd/jiri")
for _, test := range tests {
if err := testUpgrade(t, jiriTool, test); err != nil {
t.Errorf("%v: %v", test.Args, err)
}
}
}
func testUpgrade(t *testing.T, jiriTool string, test upgradeTestCase) error {
sh := gosh.NewShell(t)
sh.PropagateChildOutput = true
defer sh.Cleanup()
jiriRoot := sh.MakeTempDir()
sh.Pushd(jiriRoot)
// Set up an existing file or local_manifest, if they were specified
if test.Exist {
if err := ioutil.WriteFile(".jiri_manifest", []byte("<manifest/>"), 0644); err != nil {
return err
}
}
if test.Local != "" {
if err := ioutil.WriteFile(".local_manifest", []byte(test.Local), 0644); err != nil {
return err
}
}
// Run upgrade and check the error.
sh.Vars[jiri.RootEnv] = jiriRoot
cmd := sh.Cmd(jiriTool, append([]string{"upgrade"}, test.Args...)...)
if test.Stderr != "" {
cmd.ExitErrorIsOk = true
}
_, stderr := cmd.StdoutStderr()
if got, want := stderr, test.Stderr; !strings.Contains(got, want) || (got != "" && want == "") {
return fmt.Errorf("stderr got %q, want substr %q", got, want)
}
// Make sure the right file is generated.
if test.Want != "" {
data, err := ioutil.ReadFile(".jiri_manifest")
if err != nil {
return err
}
if got, want := string(data), test.Want; got != want {
return fmt.Errorf("GOT\n%s\nWANT\n%s", got, want)
}
}
// Make sure the .local_manifest file is backed up.
if test.Local != "" && test.Stderr == "" {
data, err := ioutil.ReadFile(".local_manifest.BACKUP")
if err != nil {
return fmt.Errorf("local manifest backup got error: %v", err)
}
if got, want := string(data), test.Local; got != want {
return fmt.Errorf("local manifest backup GOT\n%s\nWANT\n%s", got, want)
}
}
return nil
}
func TestUpgradeRevert(t *testing.T) {
sh := gosh.NewShell(t)
defer sh.Cleanup()
jiriRoot := sh.MakeTempDir()
sh.Pushd(jiriRoot)
jiriTool := gosh.BuildGoPkg(sh, sh.MakeTempDir(), "v.io/jiri/cmd/jiri")
localData := `<manifest/>`
jiriData := `<manifest>
<imports>
<import manifest="public" name="manifest" remote="https://vanadium.googlesource.com/manifest"/>
</imports>
</manifest>
`
// Set up an existing local_manifest.
if err := ioutil.WriteFile(".local_manifest", []byte(localData), 0644); err != nil {
t.Errorf("couldn't write local manifest: %v", err)
}
// Run a regular upgrade first, and make sure files are as expected.
sh.Vars[jiri.RootEnv] = jiriRoot
sh.Cmd(jiriTool, "upgrade", "v23").Run()
gotJiri, err := ioutil.ReadFile(".jiri_manifest")
if err != nil {
t.Errorf("couldn't read jiri manifest: %v", err)
}
if got, want := string(gotJiri), jiriData; got != want {
t.Errorf("jiri manifest GOT\n%s\nWANT\n%s", got, want)
}
gotBackup, err := ioutil.ReadFile(".local_manifest.BACKUP")
if err != nil {
t.Errorf("couldn't read local manifest backup: %v", err)
}
if got, want := string(gotBackup), localData; got != want {
t.Errorf("local manifest backup GOT\n%s\nWANT\n%s", got, want)
}
// Now run a revert, and make sure files are as expected.
sh.Cmd(jiriTool, "upgrade", "-revert").Run()
if _, err := os.Stat(".jiri_manifest"); !os.IsNotExist(err) {
t.Errorf(".jiri_manifest still exists after revert: %v", err)
}
if _, err := os.Stat(".local_manifest.BACKUP"); !os.IsNotExist(err) {
t.Errorf(".local_manifest.BACKUP still exists after revert: %v", err)
}
gotLocal, err := ioutil.ReadFile(".local_manifest")
if err != nil {
t.Errorf("couldn't read local manifest: %v", err)
}
if got, want := string(gotLocal), localData; got != want {
t.Errorf("local manifest GOT\n%s\nWANT\n%s", got, want)
}
}