2
0

storageconfiguration_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. package azure
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/opencost/opencost/pkg/cloud/config"
  6. "github.com/opencost/opencost/pkg/log"
  7. "github.com/opencost/opencost/pkg/util/json"
  8. )
  9. func TestStorageConfiguration_Validate(t *testing.T) {
  10. testCases := map[string]struct {
  11. config StorageConfiguration
  12. expected error
  13. }{
  14. "valid config Azure AccessKey": {
  15. config: StorageConfiguration{
  16. SubscriptionID: "subscriptionID",
  17. Account: "account",
  18. Container: "container",
  19. Path: "path",
  20. Cloud: "cloud",
  21. Authorizer: &AccessKey{
  22. AccessKey: "accessKey",
  23. Account: "account",
  24. },
  25. },
  26. expected: nil,
  27. },
  28. "access key invalid": {
  29. config: StorageConfiguration{
  30. SubscriptionID: "subscriptionID",
  31. Account: "account",
  32. Container: "container",
  33. Path: "path",
  34. Cloud: "cloud",
  35. Authorizer: &AccessKey{
  36. Account: "account",
  37. },
  38. },
  39. expected: fmt.Errorf("AccessKey: missing access key"),
  40. },
  41. "missing authorizer": {
  42. config: StorageConfiguration{
  43. SubscriptionID: "subscriptionID",
  44. Account: "account",
  45. Container: "container",
  46. Path: "path",
  47. Cloud: "cloud",
  48. Authorizer: nil,
  49. },
  50. expected: fmt.Errorf("StorageConfiguration: missing authorizer"),
  51. },
  52. "missing subscriptionID": {
  53. config: StorageConfiguration{
  54. SubscriptionID: "",
  55. Account: "account",
  56. Container: "container",
  57. Path: "path",
  58. Cloud: "cloud",
  59. Authorizer: &AccessKey{
  60. AccessKey: "accessKey",
  61. Account: "account",
  62. },
  63. },
  64. expected: fmt.Errorf("StorageConfiguration: missing Subcription ID"),
  65. },
  66. "missing account": {
  67. config: StorageConfiguration{
  68. SubscriptionID: "subscriptionID",
  69. Account: "",
  70. Container: "container",
  71. Path: "path",
  72. Cloud: "cloud",
  73. Authorizer: &AccessKey{
  74. AccessKey: "accessKey",
  75. Account: "account",
  76. },
  77. },
  78. expected: fmt.Errorf("StorageConfiguration: missing Account"),
  79. },
  80. "missing container": {
  81. config: StorageConfiguration{
  82. SubscriptionID: "subscriptionID",
  83. Account: "account",
  84. Container: "",
  85. Path: "path",
  86. Cloud: "cloud",
  87. Authorizer: &AccessKey{
  88. AccessKey: "accessKey",
  89. Account: "account",
  90. },
  91. },
  92. expected: fmt.Errorf("StorageConfiguration: missing Container"),
  93. },
  94. "missing path": {
  95. config: StorageConfiguration{
  96. SubscriptionID: "subscriptionID",
  97. Account: "account",
  98. Container: "container",
  99. Path: "",
  100. Cloud: "cloud",
  101. Authorizer: &AccessKey{
  102. AccessKey: "accessKey",
  103. Account: "account",
  104. },
  105. },
  106. expected: nil,
  107. },
  108. "missing cloud": {
  109. config: StorageConfiguration{
  110. SubscriptionID: "subscriptionID",
  111. Account: "account",
  112. Container: "container",
  113. Path: "path",
  114. Cloud: "",
  115. Authorizer: &AccessKey{
  116. AccessKey: "accessKey",
  117. Account: "account",
  118. },
  119. },
  120. expected: nil,
  121. },
  122. }
  123. for name, testCase := range testCases {
  124. t.Run(name, func(t *testing.T) {
  125. actual := testCase.config.Validate()
  126. actualString := "nil"
  127. if actual != nil {
  128. actualString = actual.Error()
  129. }
  130. expectedString := "nil"
  131. if testCase.expected != nil {
  132. expectedString = testCase.expected.Error()
  133. }
  134. if actualString != expectedString {
  135. t.Errorf("errors do not match: Actual: '%s', Expected: '%s", actualString, expectedString)
  136. }
  137. })
  138. }
  139. }
  140. func TestStorageConfiguration_Equals(t *testing.T) {
  141. testCases := map[string]struct {
  142. left StorageConfiguration
  143. right config.Config
  144. expected bool
  145. }{
  146. "matching config": {
  147. left: StorageConfiguration{
  148. SubscriptionID: "subscriptionID",
  149. Account: "account",
  150. Container: "container",
  151. Path: "path",
  152. Cloud: "cloud",
  153. Authorizer: &AccessKey{
  154. AccessKey: "accessKey",
  155. Account: "account",
  156. },
  157. },
  158. right: &StorageConfiguration{
  159. SubscriptionID: "subscriptionID",
  160. Account: "account",
  161. Container: "container",
  162. Path: "path",
  163. Cloud: "cloud",
  164. Authorizer: &AccessKey{
  165. AccessKey: "accessKey",
  166. Account: "account",
  167. },
  168. },
  169. expected: true,
  170. },
  171. "missing both authorizer": {
  172. left: StorageConfiguration{
  173. SubscriptionID: "subscriptionID",
  174. Account: "account",
  175. Container: "container",
  176. Path: "path",
  177. Cloud: "cloud",
  178. Authorizer: nil,
  179. },
  180. right: &StorageConfiguration{
  181. SubscriptionID: "subscriptionID",
  182. Account: "account",
  183. Container: "container",
  184. Path: "path",
  185. Cloud: "cloud",
  186. Authorizer: nil,
  187. },
  188. expected: true,
  189. },
  190. "missing left authorizer": {
  191. left: StorageConfiguration{
  192. SubscriptionID: "subscriptionID",
  193. Account: "account",
  194. Container: "container",
  195. Path: "path",
  196. Cloud: "cloud",
  197. Authorizer: nil,
  198. },
  199. right: &StorageConfiguration{
  200. SubscriptionID: "subscriptionID",
  201. Account: "account",
  202. Container: "container",
  203. Path: "path",
  204. Cloud: "cloud",
  205. Authorizer: &AccessKey{
  206. AccessKey: "accessKey",
  207. Account: "account",
  208. },
  209. },
  210. expected: false,
  211. },
  212. "missing right authorizer": {
  213. left: StorageConfiguration{
  214. SubscriptionID: "subscriptionID",
  215. Account: "account",
  216. Container: "container",
  217. Path: "path",
  218. Cloud: "cloud",
  219. Authorizer: &AccessKey{
  220. AccessKey: "accessKey",
  221. Account: "account",
  222. },
  223. },
  224. right: &StorageConfiguration{
  225. SubscriptionID: "subscriptionID",
  226. Account: "account",
  227. Container: "container",
  228. Path: "path",
  229. Cloud: "cloud",
  230. Authorizer: nil,
  231. },
  232. expected: false,
  233. },
  234. "different subscriptionID": {
  235. left: StorageConfiguration{
  236. SubscriptionID: "subscriptionID",
  237. Account: "account",
  238. Container: "container",
  239. Path: "path",
  240. Cloud: "cloud",
  241. Authorizer: &AccessKey{
  242. AccessKey: "accessKey",
  243. Account: "account",
  244. },
  245. },
  246. right: &StorageConfiguration{
  247. SubscriptionID: "subscriptionID2",
  248. Account: "account",
  249. Container: "container",
  250. Path: "path",
  251. Cloud: "cloud",
  252. Authorizer: &AccessKey{
  253. AccessKey: "accessKey",
  254. Account: "account",
  255. },
  256. },
  257. expected: false,
  258. },
  259. "different account": {
  260. left: StorageConfiguration{
  261. SubscriptionID: "subscriptionID",
  262. Account: "account",
  263. Container: "container",
  264. Path: "path",
  265. Cloud: "cloud",
  266. Authorizer: &AccessKey{
  267. AccessKey: "accessKey",
  268. Account: "account",
  269. },
  270. },
  271. right: &StorageConfiguration{
  272. SubscriptionID: "subscriptionID",
  273. Account: "account2",
  274. Container: "container",
  275. Path: "path",
  276. Cloud: "cloud",
  277. Authorizer: &AccessKey{
  278. AccessKey: "accessKey",
  279. Account: "account",
  280. },
  281. },
  282. expected: false,
  283. },
  284. "different container": {
  285. left: StorageConfiguration{
  286. SubscriptionID: "subscriptionID",
  287. Account: "account",
  288. Container: "container",
  289. Path: "path",
  290. Cloud: "cloud",
  291. Authorizer: &AccessKey{
  292. AccessKey: "accessKey",
  293. Account: "account",
  294. },
  295. },
  296. right: &StorageConfiguration{
  297. SubscriptionID: "subscriptionID",
  298. Account: "account",
  299. Container: "container2",
  300. Path: "path",
  301. Cloud: "cloud",
  302. Authorizer: &AccessKey{
  303. AccessKey: "accessKey",
  304. Account: "account",
  305. },
  306. },
  307. expected: false,
  308. },
  309. "different path": {
  310. left: StorageConfiguration{
  311. SubscriptionID: "subscriptionID",
  312. Account: "account",
  313. Container: "container",
  314. Path: "path",
  315. Cloud: "cloud",
  316. Authorizer: &AccessKey{
  317. AccessKey: "accessKey",
  318. Account: "account",
  319. },
  320. },
  321. right: &StorageConfiguration{
  322. SubscriptionID: "subscriptionID",
  323. Account: "account",
  324. Container: "container",
  325. Path: "path2",
  326. Cloud: "cloud",
  327. Authorizer: &AccessKey{
  328. AccessKey: "accessKey",
  329. Account: "account",
  330. },
  331. },
  332. expected: false,
  333. },
  334. "different cloud": {
  335. left: StorageConfiguration{
  336. SubscriptionID: "subscriptionID",
  337. Account: "account",
  338. Container: "container",
  339. Path: "path",
  340. Cloud: "cloud",
  341. Authorizer: &AccessKey{
  342. AccessKey: "accessKey",
  343. Account: "account",
  344. },
  345. },
  346. right: &StorageConfiguration{
  347. SubscriptionID: "subscriptionID",
  348. Account: "account",
  349. Container: "container",
  350. Path: "path",
  351. Cloud: "cloud2",
  352. Authorizer: &AccessKey{
  353. AccessKey: "accessKey",
  354. Account: "account",
  355. },
  356. },
  357. expected: false,
  358. },
  359. "different config": {
  360. left: StorageConfiguration{
  361. SubscriptionID: "subscriptionID",
  362. Account: "account",
  363. Container: "container",
  364. Path: "path",
  365. Cloud: "cloud",
  366. Authorizer: &AccessKey{
  367. AccessKey: "accessKey",
  368. Account: "account",
  369. },
  370. },
  371. right: &AccessKey{
  372. AccessKey: "accessKey",
  373. Account: "account",
  374. },
  375. expected: false,
  376. },
  377. }
  378. for name, testCase := range testCases {
  379. t.Run(name, func(t *testing.T) {
  380. actual := testCase.left.Equals(testCase.right)
  381. if actual != testCase.expected {
  382. t.Errorf("incorrect result: Actual: '%t', Expected: '%t", actual, testCase.expected)
  383. }
  384. })
  385. }
  386. }
  387. func TestStorageConfiguration_JSON(t *testing.T) {
  388. testCases := map[string]struct {
  389. config StorageConfiguration
  390. }{
  391. "Empty Config": {
  392. config: StorageConfiguration{},
  393. },
  394. "Nil Authorizer": {
  395. config: StorageConfiguration{
  396. SubscriptionID: "subscriptionID",
  397. Account: "account",
  398. Container: "container",
  399. Path: "path",
  400. Cloud: "cloud",
  401. Authorizer: nil,
  402. },
  403. },
  404. "AccessKey Authorizer": {
  405. config: StorageConfiguration{
  406. SubscriptionID: "subscriptionID",
  407. Account: "account",
  408. Container: "container",
  409. Path: "path",
  410. Cloud: "cloud",
  411. Authorizer: &AccessKey{
  412. AccessKey: "accessKey",
  413. Account: "account",
  414. },
  415. },
  416. },
  417. }
  418. for name, testCase := range testCases {
  419. t.Run(name, func(t *testing.T) {
  420. // test JSON Marshalling
  421. configJSON, err := json.Marshal(testCase.config)
  422. if err != nil {
  423. t.Errorf("failed to marshal configuration: %s", err.Error())
  424. }
  425. log.Info(string(configJSON))
  426. unmarshalledConfig := &StorageConfiguration{}
  427. err = json.Unmarshal(configJSON, unmarshalledConfig)
  428. if err != nil {
  429. t.Errorf("failed to unmarshal configuration: %s", err.Error())
  430. }
  431. if !testCase.config.Equals(unmarshalledConfig) {
  432. t.Error("config does not equal unmarshalled config")
  433. }
  434. })
  435. }
  436. }