diff --git a/snok_test.go b/snok_test.go index c756f96e83ab169f31c2f39d07ff6c448fb58974..400c0892684ff9c898816faebc7f3e5ef47aa5cf 100644 --- a/snok_test.go +++ b/snok_test.go @@ -44,6 +44,9 @@ func TestCmds(t *testing.T) { testcontainers.Logger = log.New(os.Stdout, " ", 0) } suite.Run(t) + if suite.GetLogLevel() >= DebugLevel { + t.Log(suite.Graph) + } } func mockContainer(s *TestSuite, t *testing.T, args []string) { diff --git a/test_graph.go b/test_graph.go index 68010b5973821e24ceebbaa74adbe322bb24f7e5..005a4f30907bb0b7398167d799e73258ca9d3d98 100644 --- a/test_graph.go +++ b/test_graph.go @@ -20,6 +20,10 @@ func NewTestGraph() *TestGraph { return &TestGraph{simple.NewDirectedGraph()} } +func (g *TestGraph) String() string { + return g.Dot() +} + func (g *TestGraph) AddJob(job graph.Node) { g.Graph.AddNode(job) } @@ -86,3 +90,14 @@ func (g *TestGraph) ResolveDeps() error { func (g *TestGraph) SortJobs() ([]graph.Node, error) { return topo.Sort(g.Graph) } + +func (g *TestGraph) Dot() string { + dot := "digraph G {\n" + for _, node := range graph.NodesOf(g.Graph.Nodes()) { + dot = dot + fmt.Sprintf(" %q;\n", node) + } + for _, edge := range graph.EdgesOf(g.Graph.Edges()) { + dot = dot + fmt.Sprintf(" %q -> %q;\n", edge.From(), edge.To()) + } + return dot + "}\n" +} diff --git a/test_suite.go b/test_suite.go index c41bd9ce4a8c90eb2ed89a9c73ff28dd951fc3d1..0e5fa88d1993d8e5259dd48f0341997ed935fe0d 100644 --- a/test_suite.go +++ b/test_suite.go @@ -25,6 +25,7 @@ type TestSuite struct { RootCmd *cobra.Command LogLevel LogLevel Graph *TestGraph + dotFile string unexpectedErr func(require.TestingT, error, ...interface{}) } @@ -38,6 +39,7 @@ func NewTestSuite(cmd *cobra.Command) *TestSuite { } var l string flag.StringVar(&l, "l", "info", "Log level (error, warn, info, debug, trace)") + flag.StringVar(&s.dotFile, "dot", "", "Output dot file") flag.Parse() if os.Getenv("SNOK_LOG_LEVEL") != "" { l = os.Getenv("SNOK_LOG_LEVEL") @@ -115,6 +117,18 @@ func (s *TestSuite) Run(t *testing.T) { s.addTests(t, s.RootCmd, []string{}) err := s.Graph.ResolveDeps() require.NoError(t, err) + if s.dotFile != "" { + f, err := os.Create(s.dotFile) + require.NoError(t, err) + n, err := f.WriteString(s.Graph.Dot()) + require.NoError(t, err) + t.Logf("Wrote %d bytes to %s", n, s.dotFile) + } else { + s.runTests(t) + } +} + +func (s *TestSuite) runTests(t *testing.T) { jobs, err := s.Graph.SortJobs() require.NoError(t, err) for _, job := range jobs {