| // 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 test |
| |
| import ( |
| "bufio" |
| "bytes" |
| "os" |
| "path/filepath" |
| "strings" |
| |
| "v.io/jiri" |
| "v.io/jiri/collect" |
| "v.io/jiri/gitutil" |
| "v.io/jiri/retry" |
| "v.io/x/devtools/internal/test" |
| ) |
| |
| func vanadiumSignupProxy(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupProxyHelper(jirix, "old_schema.go", testName) |
| } |
| |
| func vanadiumSignupProxyNew(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupProxyHelper(jirix, "new_schema.go", testName) |
| } |
| |
| func vanadiumSignupProxyHelper(jirix *jiri.X, schema, testName string) (_ *test.Result, e error) { |
| cleanup, err := initTest(jirix, testName, []string{"v23:base"}) |
| if err != nil { |
| return nil, newInternalError(err, "Init") |
| } |
| defer collect.Error(func() error { return cleanup() }, &e) |
| |
| // Fetch emails addresses. |
| credentials := os.Getenv("CREDENTIALS") |
| sheetID := os.Getenv("SHEET_ID") |
| |
| data, err := fetchFieldValues(jirix, credentials, "email", schema, sheetID, false) |
| if err != nil { |
| return nil, newInternalError(err, "fetch") |
| } |
| |
| // Create a feature branch in the infrastructure project. |
| infraDir := gitutil.RootDirOpt(filepath.Join(jirix.Root, "infrastructure")) |
| git := gitutil.New(jirix.NewSeq(), infraDir) |
| if err := git.CreateAndCheckoutBranch("update"); err != nil { |
| return nil, newInternalError(err, "create") |
| } |
| defer collect.Error(func() error { |
| git := gitutil.New(jirix.NewSeq(), infraDir) |
| if err := git.CheckoutBranch("master", gitutil.ForceOpt(true)); err != nil { |
| return newInternalError(err, "checkout") |
| } |
| if err := git.DeleteBranch("update", gitutil.ForceOpt(true)); err != nil { |
| return newInternalError(err, "delete") |
| } |
| return nil |
| }, &e) |
| |
| // Update emails address whitelists. |
| { |
| whitelists := strings.Split(os.Getenv("WHITELISTS"), string(filepath.ListSeparator)) |
| mergeSrc := filepath.Join(jirix.Root, "infrastructure", "signup", "merge.go") |
| s := jirix.NewSeq() |
| for _, whitelist := range whitelists { |
| if err := s.Read(bytes.NewReader(data)).Last("jiri", "go", "run", mergeSrc, "-whitelist="+whitelist); err != nil { |
| return nil, newInternalError(err, "merge") |
| } |
| if err := gitutil.New(jirix.NewSeq(), infraDir).Add(whitelist); err != nil { |
| return nil, newInternalError(err, "commit") |
| } |
| } |
| } |
| |
| // Push changes (if any exist) to master. |
| changed, err := git.HasUncommittedChanges() |
| if err != nil { |
| return nil, newInternalError(err, "changes") |
| } |
| if changed { |
| if err := git.CommitWithMessage("updating list of emails"); err != nil { |
| return nil, newInternalError(err, "commit") |
| } |
| if err := git.Push("origin", "update:master", gitutil.VerifyOpt(false)); err != nil { |
| return nil, newInternalError(err, "push") |
| } |
| } |
| |
| return &test.Result{Status: test.Passed}, nil |
| } |
| |
| func vanadiumSignupWelcomeStepOneNew(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| cleanup, err := initTest(jirix, testName, []string{"v23:base"}) |
| if err != nil { |
| return nil, newInternalError(err, "Init") |
| } |
| defer collect.Error(func() error { return cleanup() }, &e) |
| |
| credentials := os.Getenv("CREDENTIALS") |
| sheetID := os.Getenv("SHEET_ID") |
| |
| data, err := fetchFieldValues(jirix, credentials, "email", "new_schema.go", sheetID, false) |
| if err != nil { |
| return nil, newInternalError(err, "fetch") |
| } |
| |
| var emails bytes.Buffer |
| s := jirix.NewSeq() |
| |
| welcome := filepath.Join(jirix.Root, "infrastructure", "signup", "welcome.go") |
| sentlist := filepath.Join(jirix.Root, "infrastructure", "signup", "sentlist.json") |
| if err := s.Read(bytes.NewReader(data)).Capture(&emails, nil).Last("jiri", "go", "run", welcome, "-sentlist="+sentlist); err != nil { |
| return nil, newInternalError(err, "welcome") |
| } |
| |
| // Convert the newline delimited output from the command above into a slice of |
| // strings which can be written to a file in the format: |
| // |
| // EMAILS = <email> <email> <email...> |
| // |
| output := []string{"EMAILS", "="} |
| reader := bytes.NewReader(emails.Bytes()) |
| scanner := bufio.NewScanner(reader) |
| for scanner.Scan() { |
| email := scanner.Text() |
| output = append(output, email) |
| } |
| |
| if err := scanner.Err(); err != nil { |
| return nil, newInternalError(err, "Scan") |
| } |
| |
| // Join the array and convert it to bytes |
| contents := strings.Join(output, " ") |
| filename := filepath.Join(jirix.Root, ".vanadium_signup_weclome_properties") |
| |
| if err := s.WriteFile(filename, []byte(contents), 0644).Done(); err != nil { |
| return nil, newInternalError(err, "WriteFile") |
| } |
| |
| // Create a feature branch in the infrastructure project. |
| infraDir := gitutil.RootDirOpt(filepath.Join(jirix.Root, "infrastructure")) |
| git := gitutil.New(jirix.NewSeq(), infraDir) |
| if err := git.CreateAndCheckoutBranch("update"); err != nil { |
| return nil, newInternalError(err, "create") |
| } |
| defer collect.Error(func() error { |
| git := gitutil.New(jirix.NewSeq(), infraDir) |
| if err := git.CheckoutBranch("master", gitutil.ForceOpt(true)); err != nil { |
| return newInternalError(err, "checkout") |
| } |
| if err := git.DeleteBranch("update", gitutil.ForceOpt(true)); err != nil { |
| return newInternalError(err, "delete") |
| } |
| return nil |
| }, &e) |
| |
| if err := git.Add(sentlist); err != nil { |
| return nil, newInternalError(err, "commit") |
| } |
| |
| // Push changes (if any exist) to master. |
| changed, err := git.HasUncommittedChanges() |
| if err != nil { |
| return nil, newInternalError(err, "changes") |
| } |
| if changed { |
| if err := git.CommitWithMessage("infrastructure/signup: updating sentlist"); err != nil { |
| return nil, newInternalError(err, "commit") |
| } |
| if err := git.Push("origin", "update:master", gitutil.VerifyOpt(false)); err != nil { |
| return nil, newInternalError(err, "push") |
| } |
| } |
| |
| return &test.Result{Status: test.Passed}, nil |
| } |
| |
| func vanadiumSignupWelcomeStepTwoNew(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| cleanup, err := initTest(jirix, testName, []string{"v23:base"}) |
| if err != nil { |
| return nil, newInternalError(err, "Init") |
| } |
| defer collect.Error(func() error { return cleanup() }, &e) |
| |
| mailer := filepath.Join(jirix.Root, "release", "go", "src", "v.io", "x", "devtools", "mailer", "mailer.go") |
| mailerFunc := func() error { |
| return jirix.NewSeq().Last("jiri", "go", "run", mailer) |
| } |
| if err := retry.Function(jirix.Context, mailerFunc); err != nil { |
| return nil, newInternalError(err, "mailer") |
| } |
| |
| return &test.Result{Status: test.Passed}, nil |
| } |
| |
| func vanadiumSignupGithub(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupGithubHelper(jirix, "old_schema.go", testName) |
| } |
| |
| func vanadiumSignupGithubNew(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupGithubHelper(jirix, "new_schema.go", testName) |
| } |
| |
| func vanadiumSignupGithubHelper(jirix *jiri.X, schema, testName string) (_ *test.Result, e error) { |
| cleanup, err := initTest(jirix, testName, []string{"v23:base"}) |
| if err != nil { |
| return nil, newInternalError(err, "Init") |
| } |
| defer collect.Error(func() error { return cleanup() }, &e) |
| |
| credentials := os.Getenv("CREDENTIALS") |
| sheetID := os.Getenv("SHEET_ID") |
| |
| data, err := fetchFieldValues(jirix, credentials, "github", schema, sheetID, false) |
| if err != nil { |
| return nil, newInternalError(err, "fetch") |
| } |
| |
| // Add them to @vanadium/developers |
| githubToken := os.Getenv("GITHUB_TOKEN") |
| github := filepath.Join(jirix.Root, "infrastructure", "signup", "github.go") |
| if err := jirix.NewSeq().Read(bytes.NewReader(data)).Last("jiri", "go", "run", github, "-token="+githubToken); err != nil { |
| return nil, newInternalError(err, "github") |
| } |
| |
| return &test.Result{Status: test.Passed}, nil |
| } |
| |
| func vanadiumSignupGroup(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupGroupHelper(jirix, "old_schema.go", testName, false) |
| } |
| |
| func vanadiumSignupGroupNew(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupGroupHelper(jirix, "new_schema.go", testName, false) |
| } |
| |
| func vanadiumSignupDiscussNew(jirix *jiri.X, testName string, _ ...Opt) (_ *test.Result, e error) { |
| return vanadiumSignupGroupHelper(jirix, "new_schema.go", testName, true) |
| } |
| |
| func vanadiumSignupGroupHelper(jirix *jiri.X, schema, testName string, discussOnly bool) (_ *test.Result, e error) { |
| cleanup, err := initTest(jirix, testName, []string{"v23:base"}) |
| if err != nil { |
| return nil, newInternalError(err, "Init") |
| } |
| defer collect.Error(func() error { return cleanup() }, &e) |
| |
| // Fetch emails addresses. |
| credentials := os.Getenv("CREDENTIALS") |
| sheetID := os.Getenv("SHEET_ID") |
| |
| data, err := fetchFieldValues(jirix, credentials, "email", schema, sheetID, discussOnly) |
| if err != nil { |
| return nil, newInternalError(err, "fetch") |
| } |
| |
| // Add them to Google Group. |
| groupEmail := os.Getenv("GROUP_EMAIL") |
| groupSrc := filepath.Join(jirix.Root, "infrastructure", "signup", "group.go") |
| if err := jirix.NewSeq().Read(bytes.NewReader(data)).Last("jiri", "go", "run", groupSrc, "-credentials="+credentials, "-group-email="+groupEmail); err != nil { |
| return nil, newInternalError(err, "group") |
| } |
| |
| return &test.Result{Status: test.Passed}, nil |
| } |
| |
| func fetchFieldValues(jirix *jiri.X, credentials, field, schema, sheetID string, discussOnly bool) ([]byte, error) { |
| var buffer bytes.Buffer |
| |
| fetchSrc := filepath.Join(jirix.Root, "infrastructure", "signup", "fetch.go") |
| schemaSrc := filepath.Join(jirix.Root, "infrastructure", "signup", schema) |
| args := []string{"go", "run", fetchSrc, schemaSrc, "-credentials=" + credentials, "-field=" + field, "-sheet-id=" + sheetID} |
| if discussOnly { |
| args = append(args, "-discuss-only") |
| } |
| if err := jirix.NewSeq().Capture(&buffer, nil).Last("jiri", args...); err != nil { |
| return nil, err |
| } |
| return buffer.Bytes(), nil |
| } |