pulumi/pkg/cmd/pulumi/main_test.go

120 lines
3.6 KiB
Go

// Copyright 2016-2021, Pulumi Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"flag"
"fmt"
"io"
"os"
"path"
"reflect"
"testing"
"time"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
"github.com/spf13/pflag"
)
type noTestDeps int
type corpusEntry = struct {
Parent string
Path string
Data []byte
Values []interface{}
Generation int
IsSeed bool
}
func (noTestDeps) ImportPath() string { return "" }
func (noTestDeps) MatchString(pat, str string) (bool, error) { return false, nil }
func (noTestDeps) SetPanicOnExit0(bool) {}
func (noTestDeps) StartCPUProfile(io.Writer) error { return nil }
func (noTestDeps) StopCPUProfile() {}
func (noTestDeps) StartTestLog(io.Writer) {}
func (noTestDeps) StopTestLog() error { return nil }
func (noTestDeps) WriteProfileTo(string, io.Writer, int) error { return nil }
// Methods added in go 1.18 for forwards compat:
func (noTestDeps) CheckCorpus(vals []interface{}, types []reflect.Type) error { return nil }
func (noTestDeps) CoordinateFuzzing(
time.Duration, int64, time.Duration, int64, int, []corpusEntry, []reflect.Type, string, string,
) error {
return nil
}
func (noTestDeps) RunFuzzWorker(func(corpusEntry) error) error { return nil }
func (noTestDeps) ReadCorpus(string, []reflect.Type) ([]corpusEntry, error) { return nil, nil }
func (noTestDeps) ResetCoverage() {}
func (noTestDeps) SnapshotCoverage() {}
// flushProfiles flushes test profiles to disk.
func flushProfiles() {
// Redirect Stdout/err temporarily so the testing code doesn't output the
// regular:
// PASS
// coverage: 21.4% of statements
oldstdout, oldstderr := os.Stdout, os.Stderr
defer func() {
os.Stdout, os.Stderr = oldstdout, oldstderr
}()
os.Stdout, _ = os.Open(os.DevNull)
os.Stderr, _ = os.Open(os.DevNull)
cmdLine := flag.CommandLine
defer func() { flag.CommandLine = cmdLine }()
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
err := flag.CommandLine.Parse(nil)
contract.IgnoreError(err)
m := MainStart()
m.Run()
}
func addGoFlag(pf *pflag.FlagSet, f *flag.Flag) {
if pf.Lookup(f.Name) != nil || len(f.Name) == 1 && pf.ShorthandLookup(f.Name) != nil {
return
}
pf.AddGoFlag(f)
}
func TestMain(m *testing.M) {
// If the binary is invoked as `pulumi`, we are being asked to run the coverage-instrumented program. Otherwise,
// we are running tests as usual.
if path.Base(os.Args[0]) != "pulumi" {
flag.Parse()
os.Exit(m.Run())
}
defer panicHandler()
// Copy the test flags into the Pulumi command's flags.
cmd := NewPulumiCmd()
flag.CommandLine.VisitAll(func(f *flag.Flag) {
addGoFlag(cmd.PersistentFlags(), f)
})
// Now, execute the Pulumi command and dump coverage data if requested.
err := cmd.Execute()
flushProfiles()
if err != nil {
_, err = fmt.Fprintf(os.Stderr, "An error occurred: %v\n", err)
contract.IgnoreError(err)
os.Exit(1)
}
}