package dehub import ( "bytes" "dehub/accessctl" "dehub/sigcred" "io" "math/rand" "path/filepath" "testing" "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/object" yaml "gopkg.in/yaml.v2" ) type harness struct { t *testing.T rand *rand.Rand repo *Repo cfg *Config sig sigcred.SignifierInterface } func newHarness(t *testing.T) *harness { rand := rand.New(rand.NewSource(0xb4eadb01)) sig, pubKeyBody := sigcred.SignifierPGPTmp(rand) pubKeyPath := filepath.Join(DehubDir, "root.asc") cfg := &Config{ Accounts: []Account{{ ID: "root", Signifiers: []sigcred.Signifier{{PGPPublicKeyFile: &sigcred.SignifierPGPFile{ Path: pubKeyPath, }}}, }}, AccessControls: []accessctl.AccessControl{ { Pattern: "**", Condition: accessctl.Condition{ Signature: &accessctl.ConditionSignature{ AccountIDs: []string{"root"}, Count: "100%", }, }, }, }, } cfgBody, err := yaml.Marshal(cfg) if err != nil { t.Fatal(err) } h := &harness{ t: t, rand: rand, repo: InitMemRepo(), cfg: cfg, sig: sig, } h.stage(map[string]string{ ConfigPath: string(cfgBody), pubKeyPath: string(pubKeyBody), }) return h } func (h *harness) stage(tree map[string]string) { w, err := h.repo.GitRepo.Worktree() if err != nil { h.t.Fatal(err) } fs := w.Filesystem for path, content := range tree { if content == "" { if _, err := w.Remove(path); err != nil { h.t.Fatalf("error removing %q: %v", path, err) } continue } dir := filepath.Dir(path) if err := fs.MkdirAll(dir, 0666); err != nil { h.t.Fatalf("error making directory %q: %v", dir, err) } f, err := fs.Create(path) if err != nil { h.t.Fatalf("error creating file %q: %v", path, err) } else if _, err := io.Copy(f, bytes.NewBufferString(content)); err != nil { h.t.Fatalf("error writing to file %q: %v", path, err) } else if err := f.Close(); err != nil { h.t.Fatalf("error closing file %q: %v", path, err) } else if _, err := w.Add(path); err != nil { h.t.Fatalf("error adding file %q to index: %v", path, err) } } } func (h *harness) commit(msg string) plumbing.Hash { w, err := h.repo.GitRepo.Worktree() if err != nil { h.t.Fatal(err) } hash, err := w.Commit(msg, &git.CommitOptions{ Author: &object.Signature{Name: "god"}, }) if err != nil { h.t.Fatal(err) } return hash }