func TestStart(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	opts := "name=" + jobName

	u, err := us.Dial()
	if err != nil {
		panic(err)
	}

	j, err := u.Job(jobName)
	if err != nil {
		panic(err)
	}

	defer j.Start()

	err = j.Stop()
	if err != nil {
		panic(err)
	}

	res, err := tachyon.RunAdhocTask("upstart/start", opts)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}

	act, ok := res.Get("pid")
	if !ok {
		t.Fatal("pid not set")
	}

	pid, err := j.Pid()
	if err != nil {
		panic(err)
	}

	if pid != act.Read() {
		t.Fatal("job did not start?")
	}

	res, err = tachyon.RunAdhocTask("upstart/start", opts)
	if err != nil {
		panic(err)
	}

	if res.Changed {
		t.Fatal("change detected improperly")
	}

}
func TestAptDryRun(t *testing.T) {
	if !runAptTests {
		return
	}

	res, err := tachyon.RunAdhocTask("apt", "pkg=acct dryrun=true")
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Error("No change detected")
	}

	if res.Data.Get("installed") != "" {
		t.Error("incorrectly found an installed version")
	}

	if res.Data.Get("candidate") == "" {
		t.Error("no candidate found")
	}

	if res.Data.Get("dryrun") != true {
		t.Error("dryrun not true")
	}
}
func TestInstall(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	dest := "/etc/init/upstart-test-daemon.conf"

	defer os.Remove(dest)

	opts := `name=upstart-test-daemon file=test-daemon.conf.sample`

	res, err := tachyon.RunAdhocTask("upstart/install", opts)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}

	_, err = os.Stat(dest)
	if err != nil {
		t.Fatal(err)
	}
}
func TestStop(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	opts := "name=" + jobName

	u, err := us.Dial()
	if err != nil {
		panic(err)
	}

	j, err := u.Job(jobName)
	if err != nil {
		panic(err)
	}

	defer j.Start()

	res, err := tachyon.RunAdhocTask("upstart/stop", opts)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}

	res, err = tachyon.RunAdhocTask("upstart/stop", opts)
	if err != nil {
		panic(err)
	}

	if res.Changed {
		t.Fatal("change detected improperly")
	}
}
func TestDaemonScripts(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	dest := "/etc/init/upstart-test-daemon.conf"

	defer os.Remove(dest)

	opts := `name=upstart-test-daemon command="date" [email protected] [email protected] [email protected] [email protected]`

	res, err := tachyon.RunAdhocTask("upstart/daemon", opts)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}

	body, err := ioutil.ReadFile(dest)
	if err != nil {
		panic(err)
	}

	idx := bytes.Index(body, []byte("this is a prestart sample script"))
	if idx == -1 {
		t.Error("config didn't contain our script")
	}

	idx = bytes.Index(body, []byte("this is a poststart sample script"))
	if idx == -1 {
		t.Error("config didn't contain our script")
	}

	idx = bytes.Index(body, []byte("this is a prestop sample script"))
	if idx == -1 {
		t.Error("config didn't contain our script")
	}

	idx = bytes.Index(body, []byte("this is a poststop sample script"))
	if idx == -1 {
		t.Error("config didn't contain our script")
	}
}
func TestRestart(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	opts := "name=" + jobName

	u, err := us.Dial()
	if err != nil {
		panic(err)
	}

	j, err := u.Job(jobName)
	if err != nil {
		panic(err)
	}

	prev, err := j.Pid()
	if err != nil {
		panic(err)
	}

	res, err := tachyon.RunAdhocTask("upstart/restart", opts)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}

	cur, err := j.Pid()
	if err != nil {
		panic(err)
	}

	if res.Data.Get("pid") != cur {
		t.Log(res.Data)
		t.Fatal("pid not set properly")
	}

	if prev == cur {
		t.Fatal("restart did not happen")
	}
}
func TestDaemon(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	defer os.Remove("/etc/init/upstart-test-daemon.conf")

	opts := `name=upstart-test-daemon command="date"`

	res, err := tachyon.RunAdhocTask("upstart/daemon", opts)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}
}
func TestAptInstallAndRemoves(t *testing.T) {
	if !runAptTests {
		return
	}

	defer removeAcct()

	res, err := tachyon.RunAdhocTask("apt", "pkg=acct")
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("No change detected")
	}

	grep := fmt.Sprintf(`apt-cache policy acct | grep "Installed: %s"`,
		res.Data.Get("installed"))

	_, err = exec.Command("sh", "-c", grep).CombinedOutput()

	if err != nil {
		t.Errorf("package did not install")
	}

	// Test that it skips too
	// Do this here instead of another test because installing is slow

	res2, err := tachyon.RunAdhocTask("apt", "pkg=acct")
	if err != nil {
		panic(err)
	}

	if res2.Changed {
		t.Fatal("acct was reinstalled incorrectly")
	}

	res3, err := tachyon.RunAdhocTask("apt", "pkg=acct state=absent")
	if err != nil {
		panic(err)
	}

	if !res3.Changed {
		t.Fatal("acct was not removed")
	}

	if res3.Data.Get("removed") != res.Data.Get("installed") {
		t.Fatalf("removed isn't set to the version removed: '%s '%s'",
			res3.Data.Get("removed"), res.Data.Get("installed"))
	}

	res4, err := tachyon.RunAdhocTask("apt", "pkg=acct state=absent")
	if err != nil {
		panic(err)
	}

	if res4.Changed {
		t.Fatal("acct was removed again")
	}

}
func TestStartWithEnv(t *testing.T) {
	if !runUpstartTests {
		t.SkipNow()
	}

	opts := "name=" + jobName

	u, err := us.Dial()
	if err != nil {
		panic(err)
	}

	j, err := u.Job(jobName)
	if err != nil {
		panic(err)
	}

	defer j.Start()

	err = j.Stop()
	if err != nil {
		panic(err)
	}

	td := tachyon.TaskData{
		"upstart/start": map[interface{}]interface{}{
			"name": jobName,
			"env": map[interface{}]interface{}{
				"BAR": "foo",
			},
		},
	}

	res, err := tachyon.RunAdhocTaskVars(td)
	if err != nil {
		panic(err)
	}

	if !res.Changed {
		t.Fatal("no change detected")
	}

	act, ok := res.Get("pid")
	if !ok {
		t.Fatal("pid not set")
	}

	pid, err := j.Pid()
	if err != nil {
		panic(err)
	}

	if pid != act.Read() {
		t.Fatal("job did not start?")
	}

	res, err = tachyon.RunAdhocTask("upstart/start", opts)
	if err != nil {
		panic(err)
	}

	if res.Changed {
		t.Fatal("change detected improperly")
	}

}