...

Source file src/sigs.k8s.io/cli-utils/pkg/object/graph/edge_test.go

Documentation: sigs.k8s.io/cli-utils/pkg/object/graph

     1  // Copyright 2022 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package graph
     5  
     6  import (
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"k8s.io/apimachinery/pkg/runtime/schema"
    12  	"sigs.k8s.io/cli-utils/pkg/object"
    13  )
    14  
    15  func TestEdgeSort(t *testing.T) {
    16  	testCases := map[string]struct {
    17  		edges    []Edge
    18  		expected []Edge
    19  	}{
    20  		"one edge": {
    21  			edges: []Edge{
    22  				{
    23  					From: object.ObjMetadata{Name: "obj1"},
    24  					To:   object.ObjMetadata{Name: "obj2"},
    25  				},
    26  			},
    27  			expected: []Edge{
    28  				{
    29  					From: object.ObjMetadata{Name: "obj1"},
    30  					To:   object.ObjMetadata{Name: "obj2"},
    31  				},
    32  			},
    33  		},
    34  		"two edges no change": {
    35  			edges: []Edge{
    36  				{
    37  					From: object.ObjMetadata{Name: "obj1"},
    38  					To:   object.ObjMetadata{Name: "obj2"},
    39  				},
    40  				{
    41  					From: object.ObjMetadata{Name: "obj2"},
    42  					To:   object.ObjMetadata{Name: "obj3"},
    43  				},
    44  			},
    45  			expected: []Edge{
    46  				{
    47  					From: object.ObjMetadata{Name: "obj1"},
    48  					To:   object.ObjMetadata{Name: "obj2"},
    49  				},
    50  				{
    51  					From: object.ObjMetadata{Name: "obj2"},
    52  					To:   object.ObjMetadata{Name: "obj3"},
    53  				},
    54  			},
    55  		},
    56  		"two edges same from": {
    57  			edges: []Edge{
    58  				{
    59  					From: object.ObjMetadata{Name: "obj1"},
    60  					To:   object.ObjMetadata{Name: "obj3"},
    61  				},
    62  				{
    63  					From: object.ObjMetadata{Name: "obj1"},
    64  					To:   object.ObjMetadata{Name: "obj2"},
    65  				},
    66  			},
    67  			expected: []Edge{
    68  				{
    69  					From: object.ObjMetadata{Name: "obj1"},
    70  					To:   object.ObjMetadata{Name: "obj2"},
    71  				},
    72  				{
    73  					From: object.ObjMetadata{Name: "obj1"},
    74  					To:   object.ObjMetadata{Name: "obj3"},
    75  				},
    76  			},
    77  		},
    78  		"two edges": {
    79  			edges: []Edge{
    80  				{
    81  					From: object.ObjMetadata{Name: "obj2"},
    82  					To:   object.ObjMetadata{Name: "obj3"},
    83  				},
    84  				{
    85  					From: object.ObjMetadata{Name: "obj1"},
    86  					To:   object.ObjMetadata{Name: "obj2"},
    87  				},
    88  			},
    89  			expected: []Edge{
    90  				{
    91  					From: object.ObjMetadata{Name: "obj1"},
    92  					To:   object.ObjMetadata{Name: "obj2"},
    93  				},
    94  				{
    95  					From: object.ObjMetadata{Name: "obj2"},
    96  					To:   object.ObjMetadata{Name: "obj3"},
    97  				},
    98  			},
    99  		},
   100  		"two edges by name": {
   101  			edges: []Edge{
   102  				{
   103  					From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   104  					To:   object.ObjMetadata{Name: "obj3", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   105  				},
   106  				{
   107  					From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   108  					To:   object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   109  				},
   110  			},
   111  			expected: []Edge{
   112  				{
   113  					From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   114  					To:   object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   115  				},
   116  				{
   117  					From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   118  					To:   object.ObjMetadata{Name: "obj3", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   119  				},
   120  			},
   121  		},
   122  		"three edges": {
   123  			edges: []Edge{
   124  				{
   125  					From: object.ObjMetadata{Name: "obj3"},
   126  					To:   object.ObjMetadata{Name: "obj4"},
   127  				},
   128  				{
   129  					From: object.ObjMetadata{Name: "obj2"},
   130  					To:   object.ObjMetadata{Name: "obj3"},
   131  				},
   132  				{
   133  					From: object.ObjMetadata{Name: "obj1"},
   134  					To:   object.ObjMetadata{Name: "obj2"},
   135  				},
   136  			},
   137  			expected: []Edge{
   138  				{
   139  					From: object.ObjMetadata{Name: "obj1"},
   140  					To:   object.ObjMetadata{Name: "obj2"},
   141  				},
   142  				{
   143  					From: object.ObjMetadata{Name: "obj2"},
   144  					To:   object.ObjMetadata{Name: "obj3"},
   145  				},
   146  				{
   147  					From: object.ObjMetadata{Name: "obj3"},
   148  					To:   object.ObjMetadata{Name: "obj4"},
   149  				},
   150  			},
   151  		},
   152  		"two edges cycle": {
   153  			edges: []Edge{
   154  				{
   155  					From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   156  					To:   object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   157  				},
   158  				{
   159  					From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   160  					To:   object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   161  				},
   162  			},
   163  			expected: []Edge{
   164  				{
   165  					From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   166  					To:   object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   167  				},
   168  				{
   169  					From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   170  					To:   object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
   171  				},
   172  			},
   173  		},
   174  		"three edges cycle": {
   175  			edges: []Edge{
   176  				{
   177  					From: object.ObjMetadata{Name: "obj3"},
   178  					To:   object.ObjMetadata{Name: "obj1"},
   179  				},
   180  				{
   181  					From: object.ObjMetadata{Name: "obj2"},
   182  					To:   object.ObjMetadata{Name: "obj3"},
   183  				},
   184  				{
   185  					From: object.ObjMetadata{Name: "obj1"},
   186  					To:   object.ObjMetadata{Name: "obj2"},
   187  				},
   188  			},
   189  			expected: []Edge{
   190  				{
   191  					From: object.ObjMetadata{Name: "obj1"},
   192  					To:   object.ObjMetadata{Name: "obj2"},
   193  				},
   194  				{
   195  					From: object.ObjMetadata{Name: "obj2"},
   196  					To:   object.ObjMetadata{Name: "obj3"},
   197  				},
   198  				{
   199  					From: object.ObjMetadata{Name: "obj3"},
   200  					To:   object.ObjMetadata{Name: "obj1"},
   201  				},
   202  			},
   203  		},
   204  	}
   205  
   206  	for tn, tc := range testCases {
   207  		t.Run(tn, func(t *testing.T) {
   208  			sort.Sort(SortableEdges(tc.edges))
   209  			assert.Equal(t, tc.expected, tc.edges)
   210  		})
   211  	}
   212  }
   213  

View as plain text