/common/fe-ste-models_test.go

https://github.com/Azure/azure-storage-azcopy · Go · 175 lines · 109 code · 42 blank · 24 comment · 1 complexity · 73f93ce85692afa22d2e5f020bb4498a MD5 · raw file

  1. // Copyright © 2017 Microsoft <wastore@microsoft.com>
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy
  4. // of this software and associated documentation files (the "Software"), to deal
  5. // in the Software without restriction, including without limitation the rights
  6. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. // copies of the Software, and to permit persons to whom the Software is
  8. // furnished to do so, subject to the following conditions:
  9. //
  10. // The above copyright notice and this permission notice shall be included in
  11. // all copies or substantial portions of the Software.
  12. //
  13. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19. // THE SOFTWARE.
  20. package common_test
  21. import (
  22. "github.com/Azure/azure-storage-azcopy/common"
  23. chk "gopkg.in/check.v1"
  24. )
  25. type feSteModelsTestSuite struct{}
  26. var _ = chk.Suite(&feSteModelsTestSuite{})
  27. func (s *feSteModelsTestSuite) TestEnhanceJobStatusInfo(c *chk.C) {
  28. status := common.EJobStatus
  29. status = status.EnhanceJobStatusInfo(true, true, true)
  30. c.Assert(status, chk.Equals, common.EJobStatus.CompletedWithErrorsAndSkipped())
  31. status = status.EnhanceJobStatusInfo(true, true, false)
  32. c.Assert(status, chk.Equals, common.EJobStatus.CompletedWithErrorsAndSkipped())
  33. status = status.EnhanceJobStatusInfo(true, false, true)
  34. c.Assert(status, chk.Equals, common.EJobStatus.CompletedWithSkipped())
  35. status = status.EnhanceJobStatusInfo(true, false, false)
  36. c.Assert(status, chk.Equals, common.EJobStatus.CompletedWithSkipped())
  37. status = status.EnhanceJobStatusInfo(false, true, true)
  38. c.Assert(status, chk.Equals, common.EJobStatus.CompletedWithErrors())
  39. status = status.EnhanceJobStatusInfo(false, true, false)
  40. c.Assert(status, chk.Equals, common.EJobStatus.Failed())
  41. status = status.EnhanceJobStatusInfo(false, false, true)
  42. c.Assert(status, chk.Equals, common.EJobStatus.Completed())
  43. // No-op if all are false
  44. status = status.EnhanceJobStatusInfo(false, false, false)
  45. c.Assert(status, chk.Equals, common.EJobStatus.Completed())
  46. }
  47. func (s *feSteModelsTestSuite) TestIsJobDone(c *chk.C) {
  48. status := common.EJobStatus.InProgress()
  49. c.Assert(status.IsJobDone(), chk.Equals, false)
  50. status = status.Paused()
  51. c.Assert(status.IsJobDone(), chk.Equals, false)
  52. status = status.Cancelling()
  53. c.Assert(status.IsJobDone(), chk.Equals, false)
  54. status = status.Cancelled()
  55. c.Assert(status.IsJobDone(), chk.Equals, true)
  56. status = status.Completed()
  57. c.Assert(status.IsJobDone(), chk.Equals, true)
  58. status = status.CompletedWithErrors()
  59. c.Assert(status.IsJobDone(), chk.Equals, true)
  60. status = status.CompletedWithSkipped()
  61. c.Assert(status.IsJobDone(), chk.Equals, true)
  62. status = status.CompletedWithErrors()
  63. c.Assert(status.IsJobDone(), chk.Equals, true)
  64. status = status.CompletedWithErrorsAndSkipped()
  65. c.Assert(status.IsJobDone(), chk.Equals, true)
  66. status = status.Failed()
  67. c.Assert(status.IsJobDone(), chk.Equals, true)
  68. }
  69. func getInvalidMetadataSample() common.Metadata {
  70. m := make(map[string]string)
  71. // number could not be first char for azure metadata key.
  72. m["1abc"] = "v:1abc"
  73. // special char
  74. m["a!@#"] = "v:a!@#"
  75. m["a-metadata-samplE"] = "v:a-metadata-samplE"
  76. // valid metadata
  77. m["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRUSTUVWXYZ1234567890_"] = "v:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRUSTUVWXYZ1234567890_"
  78. m["Am"] = "v:Am"
  79. m["_123"] = "v:_123"
  80. return m
  81. }
  82. func getValidMetadataSample() common.Metadata {
  83. m := make(map[string]string)
  84. m["Key"] = "value"
  85. return m
  86. }
  87. func validateMapEqual(c *chk.C, m1 map[string]string, m2 map[string]string) {
  88. c.Assert(len(m1), chk.Equals, len(m2))
  89. for k1, v1 := range m1 {
  90. c.Assert(m2[k1], chk.Equals, v1)
  91. }
  92. }
  93. func (s *feSteModelsTestSuite) TestMetadataExcludeInvalidKey(c *chk.C) {
  94. mInvalid := getInvalidMetadataSample()
  95. mValid := getValidMetadataSample()
  96. retainedMetadata, excludedMetadata, invalidKeyExists := mInvalid.ExcludeInvalidKey()
  97. c.Assert(invalidKeyExists, chk.Equals, true)
  98. validateMapEqual(c, retainedMetadata,
  99. map[string]string{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRUSTUVWXYZ1234567890_": "v:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRUSTUVWXYZ1234567890_",
  100. "Am": "v:Am", "_123": "v:_123"})
  101. validateMapEqual(c, excludedMetadata,
  102. map[string]string{"1abc": "v:1abc", "a!@#": "v:a!@#", "a-metadata-samplE": "v:a-metadata-samplE"})
  103. retainedMetadata, excludedMetadata, invalidKeyExists = mValid.ExcludeInvalidKey()
  104. c.Assert(invalidKeyExists, chk.Equals, false)
  105. validateMapEqual(c, retainedMetadata, map[string]string{"Key": "value"})
  106. c.Assert(len(excludedMetadata), chk.Equals, 0)
  107. c.Assert(retainedMetadata.ConcatenatedKeys(), chk.Equals, "'Key' ")
  108. }
  109. func (s *feSteModelsTestSuite) TestMetadataResolveInvalidKey(c *chk.C) {
  110. mInvalid := getInvalidMetadataSample()
  111. mValid := getValidMetadataSample()
  112. resolvedMetadata, err := mInvalid.ResolveInvalidKey()
  113. c.Assert(err, chk.IsNil)
  114. validateMapEqual(c, resolvedMetadata,
  115. map[string]string{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRUSTUVWXYZ1234567890_": "v:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRUSTUVWXYZ1234567890_",
  116. "Am": "v:Am", "_123": "v:_123", "rename_1abc": "v:1abc", "rename_key_1abc": "1abc", "rename_a___": "v:a!@#", "rename_key_a___": "a!@#",
  117. "rename_a_metadata_samplE": "v:a-metadata-samplE", "rename_key_a_metadata_samplE": "a-metadata-samplE"})
  118. resolvedMetadata, err = mValid.ResolveInvalidKey()
  119. c.Assert(err, chk.IsNil)
  120. validateMapEqual(c, resolvedMetadata, map[string]string{"Key": "value"})
  121. }
  122. // In this phase we keep the resolve logic easy, and whenever there is key resolving collision found, error reported.
  123. func (s *feSteModelsTestSuite) TestMetadataResolveInvalidKeyNegative(c *chk.C) {
  124. mNegative1 := common.Metadata(map[string]string{"!": "!", "*": "*"})
  125. mNegative2 := common.Metadata(map[string]string{"!": "!", "rename__": "rename__"})
  126. mNegative3 := common.Metadata(map[string]string{"!": "!", "rename_key__": "rename_key__"})
  127. _, err := mNegative1.ResolveInvalidKey()
  128. c.Assert(err, chk.NotNil)
  129. _, err = mNegative2.ResolveInvalidKey()
  130. c.Assert(err, chk.NotNil)
  131. _, err = mNegative3.ResolveInvalidKey()
  132. c.Assert(err, chk.NotNil)
  133. }