container_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package kubemodel
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestValidateContainer(t *testing.T) {
  8. start := time.Now().UTC().Truncate(time.Hour)
  9. end := start.Add(time.Hour)
  10. window := Window{Start: start, End: end}
  11. tests := []struct {
  12. name string
  13. container *Container
  14. wantErr string
  15. }{
  16. {
  17. name: "empty PodUID",
  18. container: &Container{Name: "my-container", Start: start, End: end},
  19. wantErr: "PodUID is missing for Container with name 'my-container'",
  20. },
  21. {
  22. name: "empty Name",
  23. container: &Container{PodUID: "pod-uid", Start: start, End: end},
  24. wantErr: "Name is missing for Container on pod 'pod-uid'",
  25. },
  26. {
  27. name: "outside window",
  28. container: &Container{PodUID: "pod-uid", Name: "my-container", Start: start.Add(-time.Hour), End: end},
  29. wantErr: checkWindow(window, start.Add(-time.Hour), end).Error(),
  30. },
  31. {
  32. name: "valid",
  33. container: &Container{PodUID: "pod-uid", Name: "my-container", Start: start, End: end},
  34. },
  35. }
  36. for _, tt := range tests {
  37. t.Run(tt.name, func(t *testing.T) {
  38. err := tt.container.ValidateContainer(window)
  39. if tt.wantErr != "" {
  40. require.EqualError(t, err, tt.wantErr)
  41. } else {
  42. require.NoError(t, err)
  43. }
  44. })
  45. }
  46. }
  47. func TestRegisterContainer(t *testing.T) {
  48. start := time.Now().UTC().Truncate(time.Hour)
  49. end := start.Add(time.Hour)
  50. newContainer := func(podUID, name string) *Container {
  51. return &Container{PodUID: podUID, Name: name, Start: start, End: end}
  52. }
  53. tests := []struct {
  54. name string
  55. setup func(*KubeModelSet)
  56. container *Container
  57. wantErr string
  58. want *KubeModelSet
  59. }{
  60. {
  61. name: "validation failure",
  62. container: &Container{PodUID: "", Name: "my-container", Start: start, End: end},
  63. wantErr: "RegisterContainer: invalid container: PodUID is missing for Container with name 'my-container'",
  64. want: func() *KubeModelSet {
  65. kms := NewKubeModelSet(start, end)
  66. kms.Metadata.Diagnostics = []Diagnostic{
  67. {Level: DiagnosticLevelError, Message: "RegisterContainer: invalid container: PodUID is missing for Container with name 'my-container'"},
  68. }
  69. return kms
  70. }(),
  71. },
  72. {
  73. name: "registers container",
  74. container: newContainer("pod-uid", "my-container"),
  75. want: func() *KubeModelSet {
  76. kms := NewKubeModelSet(start, end)
  77. kms.Containers["pod-uid/my-container"] = newContainer("pod-uid", "my-container")
  78. kms.Metadata.ObjectCount = 1
  79. return kms
  80. }(),
  81. },
  82. {
  83. name: "duplicate registration is a no-op",
  84. setup: func(kms *KubeModelSet) {
  85. kms.RegisterContainer(newContainer("pod-uid", "original"))
  86. },
  87. container: newContainer("pod-uid", "original"),
  88. want: func() *KubeModelSet {
  89. kms := NewKubeModelSet(start, end)
  90. kms.Containers["pod-uid/original"] = newContainer("pod-uid", "original")
  91. kms.Metadata.ObjectCount = 1
  92. return kms
  93. }(),
  94. },
  95. }
  96. for _, tt := range tests {
  97. t.Run(tt.name, func(t *testing.T) {
  98. kms := NewKubeModelSet(start, end)
  99. if tt.setup != nil {
  100. tt.setup(kms)
  101. }
  102. err := kms.RegisterContainer(tt.container)
  103. if tt.wantErr != "" {
  104. require.EqualError(t, err, tt.wantErr)
  105. } else {
  106. require.NoError(t, err)
  107. }
  108. KubeModelSetEquals(t, tt.want, kms)
  109. })
  110. }
  111. }