multirestmapper_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /*
  2. Copyright 2014 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package meta
  14. import (
  15. "errors"
  16. "reflect"
  17. "testing"
  18. "k8s.io/kubernetes/pkg/api/unversioned"
  19. )
  20. func TestMultiRESTMapperResourceFor(t *testing.T) {
  21. tcs := []struct {
  22. name string
  23. mapper MultiRESTMapper
  24. input unversioned.GroupVersionResource
  25. result unversioned.GroupVersionResource
  26. err error
  27. }{
  28. {
  29. name: "empty",
  30. mapper: MultiRESTMapper{},
  31. input: unversioned.GroupVersionResource{Resource: "foo"},
  32. result: unversioned.GroupVersionResource{},
  33. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  34. },
  35. {
  36. name: "ignore not found",
  37. mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}},
  38. input: unversioned.GroupVersionResource{Resource: "foo"},
  39. result: unversioned.GroupVersionResource{},
  40. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  41. },
  42. {
  43. name: "accept first failure",
  44. mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "unused"}}}},
  45. input: unversioned.GroupVersionResource{Resource: "foo"},
  46. result: unversioned.GroupVersionResource{},
  47. err: errors.New("fail on this"),
  48. },
  49. }
  50. for _, tc := range tcs {
  51. actualResult, actualErr := tc.mapper.ResourceFor(tc.input)
  52. if e, a := tc.result, actualResult; e != a {
  53. t.Errorf("%s: expected %v, got %v", tc.name, e, a)
  54. }
  55. switch {
  56. case tc.err == nil && actualErr == nil:
  57. case tc.err == nil:
  58. t.Errorf("%s: unexpected error: %v", tc.name, actualErr)
  59. case actualErr == nil:
  60. t.Errorf("%s: expected error: %v got nil", tc.name, tc.err)
  61. case tc.err.Error() != actualErr.Error():
  62. t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr)
  63. }
  64. }
  65. }
  66. func TestMultiRESTMapperResourcesFor(t *testing.T) {
  67. tcs := []struct {
  68. name string
  69. mapper MultiRESTMapper
  70. input unversioned.GroupVersionResource
  71. result []unversioned.GroupVersionResource
  72. err error
  73. }{
  74. {
  75. name: "empty",
  76. mapper: MultiRESTMapper{},
  77. input: unversioned.GroupVersionResource{Resource: "foo"},
  78. result: nil,
  79. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  80. },
  81. {
  82. name: "ignore not found",
  83. mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}},
  84. input: unversioned.GroupVersionResource{Resource: "foo"},
  85. result: nil,
  86. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  87. },
  88. {
  89. name: "accept first failure",
  90. mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "unused"}}}},
  91. input: unversioned.GroupVersionResource{Resource: "foo"},
  92. result: nil,
  93. err: errors.New("fail on this"),
  94. },
  95. {
  96. name: "union and dedup",
  97. mapper: MultiRESTMapper{
  98. fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "dupe"}, {Resource: "first"}}},
  99. fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "dupe"}, {Resource: "second"}}},
  100. },
  101. input: unversioned.GroupVersionResource{Resource: "foo"},
  102. result: []unversioned.GroupVersionResource{{Resource: "dupe"}, {Resource: "first"}, {Resource: "second"}},
  103. },
  104. {
  105. name: "skip not and continue",
  106. mapper: MultiRESTMapper{
  107. fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}},
  108. fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "first"}, {Resource: "second"}}},
  109. },
  110. input: unversioned.GroupVersionResource{Resource: "foo"},
  111. result: []unversioned.GroupVersionResource{{Resource: "first"}, {Resource: "second"}},
  112. },
  113. }
  114. for _, tc := range tcs {
  115. actualResult, actualErr := tc.mapper.ResourcesFor(tc.input)
  116. if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) {
  117. t.Errorf("%s: expected %v, got %v", tc.name, e, a)
  118. }
  119. switch {
  120. case tc.err == nil && actualErr == nil:
  121. case tc.err == nil:
  122. t.Errorf("%s: unexpected error: %v", tc.name, actualErr)
  123. case actualErr == nil:
  124. t.Errorf("%s: expected error: %v got nil", tc.name, tc.err)
  125. case tc.err.Error() != actualErr.Error():
  126. t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr)
  127. }
  128. }
  129. }
  130. func TestMultiRESTMapperKindsFor(t *testing.T) {
  131. tcs := []struct {
  132. name string
  133. mapper MultiRESTMapper
  134. input unversioned.GroupVersionResource
  135. result []unversioned.GroupVersionKind
  136. err error
  137. }{
  138. {
  139. name: "empty",
  140. mapper: MultiRESTMapper{},
  141. input: unversioned.GroupVersionResource{Resource: "foo"},
  142. result: nil,
  143. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  144. },
  145. {
  146. name: "ignore not found",
  147. mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}},
  148. input: unversioned.GroupVersionResource{Resource: "foo"},
  149. result: nil,
  150. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  151. },
  152. {
  153. name: "accept first failure",
  154. mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "unused"}}}},
  155. input: unversioned.GroupVersionResource{Resource: "foo"},
  156. result: nil,
  157. err: errors.New("fail on this"),
  158. },
  159. {
  160. name: "union and dedup",
  161. mapper: MultiRESTMapper{
  162. fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "dupe"}, {Kind: "first"}}},
  163. fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "dupe"}, {Kind: "second"}}},
  164. },
  165. input: unversioned.GroupVersionResource{Resource: "foo"},
  166. result: []unversioned.GroupVersionKind{{Kind: "dupe"}, {Kind: "first"}, {Kind: "second"}},
  167. },
  168. {
  169. name: "skip not and continue",
  170. mapper: MultiRESTMapper{
  171. fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}},
  172. fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "first"}, {Kind: "second"}}},
  173. },
  174. input: unversioned.GroupVersionResource{Resource: "foo"},
  175. result: []unversioned.GroupVersionKind{{Kind: "first"}, {Kind: "second"}},
  176. },
  177. }
  178. for _, tc := range tcs {
  179. actualResult, actualErr := tc.mapper.KindsFor(tc.input)
  180. if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) {
  181. t.Errorf("%s: expected %v, got %v", tc.name, e, a)
  182. }
  183. switch {
  184. case tc.err == nil && actualErr == nil:
  185. case tc.err == nil:
  186. t.Errorf("%s: unexpected error: %v", tc.name, actualErr)
  187. case actualErr == nil:
  188. t.Errorf("%s: expected error: %v got nil", tc.name, tc.err)
  189. case tc.err.Error() != actualErr.Error():
  190. t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr)
  191. }
  192. }
  193. }
  194. func TestMultiRESTMapperKindFor(t *testing.T) {
  195. tcs := []struct {
  196. name string
  197. mapper MultiRESTMapper
  198. input unversioned.GroupVersionResource
  199. result unversioned.GroupVersionKind
  200. err error
  201. }{
  202. {
  203. name: "empty",
  204. mapper: MultiRESTMapper{},
  205. input: unversioned.GroupVersionResource{Resource: "foo"},
  206. result: unversioned.GroupVersionKind{},
  207. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  208. },
  209. {
  210. name: "ignore not found",
  211. mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}},
  212. input: unversioned.GroupVersionResource{Resource: "foo"},
  213. result: unversioned.GroupVersionKind{},
  214. err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}},
  215. },
  216. {
  217. name: "accept first failure",
  218. mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "unused"}}}},
  219. input: unversioned.GroupVersionResource{Resource: "foo"},
  220. result: unversioned.GroupVersionKind{},
  221. err: errors.New("fail on this"),
  222. },
  223. }
  224. for _, tc := range tcs {
  225. actualResult, actualErr := tc.mapper.KindFor(tc.input)
  226. if e, a := tc.result, actualResult; e != a {
  227. t.Errorf("%s: expected %v, got %v", tc.name, e, a)
  228. }
  229. switch {
  230. case tc.err == nil && actualErr == nil:
  231. case tc.err == nil:
  232. t.Errorf("%s: unexpected error: %v", tc.name, actualErr)
  233. case actualErr == nil:
  234. t.Errorf("%s: expected error: %v got nil", tc.name, tc.err)
  235. case tc.err.Error() != actualErr.Error():
  236. t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr)
  237. }
  238. }
  239. }
  240. func TestMultiRESTMapperRESTMappings(t *testing.T) {
  241. mapping1, mapping2 := &RESTMapping{}, &RESTMapping{}
  242. tcs := []struct {
  243. name string
  244. mapper MultiRESTMapper
  245. input unversioned.GroupKind
  246. result []*RESTMapping
  247. err error
  248. }{
  249. {
  250. name: "empty",
  251. mapper: MultiRESTMapper{},
  252. input: unversioned.GroupKind{Kind: "Foo"},
  253. result: nil,
  254. err: &NoKindMatchError{PartialKind: unversioned.GroupVersionKind{Kind: "Foo"}},
  255. },
  256. {
  257. name: "ignore not found",
  258. mapper: MultiRESTMapper{fixedRESTMapper{err: &NoKindMatchError{PartialKind: unversioned.GroupVersionKind{Kind: "IGNORE_THIS"}}}},
  259. input: unversioned.GroupKind{Kind: "Foo"},
  260. result: nil,
  261. err: &NoKindMatchError{PartialKind: unversioned.GroupVersionKind{Kind: "Foo"}},
  262. },
  263. {
  264. name: "accept first failure",
  265. mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{mappings: []*RESTMapping{mapping1}}},
  266. input: unversioned.GroupKind{Kind: "Foo"},
  267. result: nil,
  268. err: errors.New("fail on this"),
  269. },
  270. {
  271. name: "return both",
  272. mapper: MultiRESTMapper{fixedRESTMapper{mappings: []*RESTMapping{mapping1}}, fixedRESTMapper{mappings: []*RESTMapping{mapping2}}},
  273. input: unversioned.GroupKind{Kind: "Foo"},
  274. result: []*RESTMapping{mapping1, mapping2},
  275. },
  276. }
  277. for _, tc := range tcs {
  278. actualResult, actualErr := tc.mapper.RESTMappings(tc.input)
  279. if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) {
  280. t.Errorf("%s: expected %v, got %v", tc.name, e, a)
  281. }
  282. switch {
  283. case tc.err == nil && actualErr == nil:
  284. case tc.err == nil:
  285. t.Errorf("%s: unexpected error: %v", tc.name, actualErr)
  286. case actualErr == nil:
  287. t.Errorf("%s: expected error: %v got nil", tc.name, tc.err)
  288. case tc.err.Error() != actualErr.Error():
  289. t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr)
  290. }
  291. }
  292. }
  293. type fixedRESTMapper struct {
  294. resourcesFor []unversioned.GroupVersionResource
  295. kindsFor []unversioned.GroupVersionKind
  296. resourceFor unversioned.GroupVersionResource
  297. kindFor unversioned.GroupVersionKind
  298. mappings []*RESTMapping
  299. err error
  300. }
  301. func (m fixedRESTMapper) ResourceSingularizer(resource string) (singular string, err error) {
  302. return "", m.err
  303. }
  304. func (m fixedRESTMapper) ResourcesFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionResource, error) {
  305. return m.resourcesFor, m.err
  306. }
  307. func (m fixedRESTMapper) KindsFor(resource unversioned.GroupVersionResource) (gvk []unversioned.GroupVersionKind, err error) {
  308. return m.kindsFor, m.err
  309. }
  310. func (m fixedRESTMapper) ResourceFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionResource, error) {
  311. return m.resourceFor, m.err
  312. }
  313. func (m fixedRESTMapper) KindFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionKind, error) {
  314. return m.kindFor, m.err
  315. }
  316. func (m fixedRESTMapper) RESTMapping(gk unversioned.GroupKind, versions ...string) (mapping *RESTMapping, err error) {
  317. return nil, m.err
  318. }
  319. func (m fixedRESTMapper) RESTMappings(gk unversioned.GroupKind) (mappings []*RESTMapping, err error) {
  320. return m.mappings, m.err
  321. }
  322. func (m fixedRESTMapper) AliasesForResource(alias string) (aliases []string, ok bool) {
  323. return nil, false
  324. }
  325. func (m fixedRESTMapper) ResourceIsValid(resource unversioned.GroupVersionResource) bool {
  326. return false
  327. }