@@ -20,10 +20,12 @@ import (
20
20
"context"
21
21
"errors"
22
22
"fmt"
23
+ "maps"
23
24
"math/rand"
24
25
"net/http"
25
26
"reflect"
26
27
goruntime "runtime"
28
+ "slices"
27
29
"strconv"
28
30
"sync"
29
31
"sync/atomic"
@@ -2057,30 +2059,48 @@ func TestReflectorReplacesStoreOnUnsafeDelete(t *testing.T) {
2057
2059
}
2058
2060
2059
2061
func TestReflectorRespectStoreTransformer (t * testing.T ) {
2060
- type testReflectorStore interface {
2061
- ReflectorStore
2062
- list () []interface {}
2063
- }
2064
-
2065
- for name , storeBuilder := range map [string ]func (counter * atomic.Int32 ) testReflectorStore {
2066
- "real-fifo" : func (counter * atomic.Int32 ) testReflectorStore {
2067
- return NewRealFIFO (MetaNamespaceKeyFunc , NewStore (MetaNamespaceKeyFunc ), func (i interface {}) (interface {}, error ) {
2068
- counter .Add (1 )
2069
- cast := i .(* v1.Pod )
2070
- cast .Spec .Hostname = "transformed"
2071
- return cast , nil
2072
- })
2073
- },
2074
- "delta-fifo" : func (counter * atomic.Int32 ) testReflectorStore {
2075
- return NewDeltaFIFOWithOptions (DeltaFIFOOptions {
2076
- KeyFunction : MetaNamespaceKeyFunc ,
2077
- Transformer : func (i interface {}) (interface {}, error ) {
2062
+ for name , test := range map [string ]struct {
2063
+ storeBuilder func (counter * atomic.Int32 ) ReflectorStore
2064
+ items func (rs ReflectorStore ) []interface {}
2065
+ }{
2066
+ "real-fifo" : {
2067
+ storeBuilder : func (counter * atomic.Int32 ) ReflectorStore {
2068
+ return NewRealFIFO (MetaNamespaceKeyFunc , NewStore (MetaNamespaceKeyFunc ), func (i interface {}) (interface {}, error ) {
2078
2069
counter .Add (1 )
2079
2070
cast := i .(* v1.Pod )
2080
2071
cast .Spec .Hostname = "transformed"
2081
2072
return cast , nil
2082
- },
2083
- })
2073
+ })
2074
+ },
2075
+ items : func (rs ReflectorStore ) []interface {} {
2076
+ store := rs .(* RealFIFO )
2077
+ objects := make (map [string ]interface {})
2078
+ for _ , item := range store .getItems () {
2079
+ key , _ := store .keyFunc (item .Object )
2080
+ if item .Type == Deleted {
2081
+ delete (objects , key )
2082
+ } else {
2083
+ objects [key ] = item .Object
2084
+ }
2085
+ }
2086
+ return slices .Collect (maps .Values (objects ))
2087
+ },
2088
+ },
2089
+ "delta-fifo" : {
2090
+ storeBuilder : func (counter * atomic.Int32 ) ReflectorStore {
2091
+ return NewDeltaFIFOWithOptions (DeltaFIFOOptions {
2092
+ KeyFunction : MetaNamespaceKeyFunc ,
2093
+ Transformer : func (i interface {}) (interface {}, error ) {
2094
+ counter .Add (1 )
2095
+ cast := i .(* v1.Pod )
2096
+ cast .Spec .Hostname = "transformed"
2097
+ return cast , nil
2098
+ },
2099
+ })
2100
+ },
2101
+ items : func (rs ReflectorStore ) []interface {} {
2102
+ return rs .(* DeltaFIFO ).list ()
2103
+ },
2084
2104
},
2085
2105
} {
2086
2106
t .Run (name , func (t * testing.T ) {
@@ -2113,7 +2133,7 @@ func TestReflectorRespectStoreTransformer(t *testing.T) {
2113
2133
}
2114
2134
2115
2135
var transformerInvoked atomic.Int32
2116
- s := storeBuilder (& transformerInvoked )
2136
+ s := test . storeBuilder (& transformerInvoked )
2117
2137
2118
2138
var once sync.Once
2119
2139
lw := & ListWatch {
@@ -2158,10 +2178,11 @@ func TestReflectorRespectStoreTransformer(t *testing.T) {
2158
2178
t .Errorf ("expected LastSyncResourceVersion to be %q, but got: %q" , want , got )
2159
2179
}
2160
2180
2161
- if want , got := 3 , len (s .list ()); want != got {
2181
+ informerItems := test .items (s )
2182
+ if want , got := 3 , len (informerItems ); want != got {
2162
2183
t .Errorf ("expected informer to contain %d objects, but got: %d" , want , got )
2163
2184
}
2164
- for _ , item := range s . list () {
2185
+ for _ , item := range informerItems {
2165
2186
cast := item .(* v1.Pod )
2166
2187
if cast .Spec .Hostname != "transformed" {
2167
2188
t .Error ("Object was not transformed prior to replacement" )
0 commit comments