/cmd/s3NameResolver_test.go

https://github.com/Azure/azure-storage-azcopy · Go · 149 lines · 99 code · 27 blank · 23 comment · 4 complexity · 2c78ed5a9153b75be5e1847a0690f7e7 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 cmd
  21. import (
  22. "strings"
  23. "github.com/Azure/azure-storage-azcopy/common"
  24. chk "gopkg.in/check.v1"
  25. )
  26. // Hookup to the testing framework
  27. type s3NameResolverTestSuite struct{}
  28. var _ = chk.Suite(&s3NameResolverTestSuite{})
  29. func (s *s3NameResolverTestSuite) TestS3BucketNameToAzureResourceResolverSingleBucketName(c *chk.C) {
  30. r := NewS3BucketNameToAzureResourcesResolver([]string{"bucket.name.1"})
  31. resolvedName, err := r.ResolveName("bucket.name.1")
  32. c.Assert(err, chk.IsNil)
  33. c.Assert(resolvedName, chk.Equals, "bucket-name-1")
  34. r = NewS3BucketNameToAzureResourcesResolver([]string{"bucket-name"})
  35. resolvedName, err = r.ResolveName("bucket-name")
  36. c.Assert(err, chk.IsNil)
  37. c.Assert(resolvedName, chk.Equals, "bucket-name")
  38. r = NewS3BucketNameToAzureResourcesResolver([]string{"bucket--name"})
  39. resolvedName, err = r.ResolveName("bucket--name")
  40. c.Assert(err, chk.IsNil)
  41. c.Assert(resolvedName, chk.Equals, "bucket-2-name")
  42. r = NewS3BucketNameToAzureResourcesResolver([]string{"bucketvalidname"})
  43. resolvedName, err = r.ResolveName("bucketvalidname")
  44. c.Assert(err, chk.IsNil)
  45. c.Assert(resolvedName, chk.Equals, "bucketvalidname")
  46. r = NewS3BucketNameToAzureResourcesResolver([]string{"0123456789.0123456789.0123456789.012345678901234567890123456789"})
  47. resolvedName, err = r.ResolveName("0123456789.0123456789.0123456789.012345678901234567890123456789")
  48. c.Assert(err, chk.IsNil)
  49. c.Assert(resolvedName, chk.Equals, "0123456789-0123456789-0123456789-012345678901234567890123456789")
  50. r = NewS3BucketNameToAzureResourcesResolver([]string{"0123456789--01234567890123456789012345678901234567890123456789"})
  51. resolvedName, err = r.ResolveName("0123456789--01234567890123456789012345678901234567890123456789")
  52. c.Assert(err, chk.IsNil)
  53. c.Assert(resolvedName, chk.Equals, "0123456789-2-01234567890123456789012345678901234567890123456789")
  54. }
  55. func (s *s3NameResolverTestSuite) TestS3BucketNameToAzureResourceResolverMultipleBucketNames(c *chk.C) {
  56. r := NewS3BucketNameToAzureResourcesResolver(
  57. []string{"bucket.name", "bucket-name", "bucket-name-2", "bucket-name-3",
  58. "bucket---name", "bucket-s--s---s", "abcdefghijklmnopqrstuvwxyz-s--s---s-s0123456789",
  59. "bucket--name", "bucket-2-name", "bucket-2-name-3", "bucket.compose----name.1---hello",
  60. "a-b---c", "a.b---c"})
  61. // Need resolve
  62. resolvedName, err := r.ResolveName("bucket---name")
  63. c.Assert(err, chk.IsNil)
  64. c.Assert(resolvedName, chk.Equals, "bucket-3-name")
  65. resolvedName, err = r.ResolveName("bucket-s--s---s")
  66. c.Assert(err, chk.IsNil)
  67. c.Assert(resolvedName, chk.Equals, "bucket-s-2-s-3-s")
  68. resolvedName, err = r.ResolveName("abcdefghijklmnopqrstuvwxyz-s--s---s-s0123456789")
  69. c.Assert(err, chk.IsNil)
  70. c.Assert(resolvedName, chk.Equals, "abcdefghijklmnopqrstuvwxyz-s-2-s-3-s-s0123456789")
  71. // Resolved, and need add further add suffix
  72. resolvedName, err = r.ResolveName("bucket.name")
  73. c.Assert(err, chk.IsNil)
  74. c.Assert(resolvedName, chk.Equals, "bucket-name-4")
  75. resolvedName, err = r.ResolveName("bucket--name")
  76. c.Assert(err, chk.IsNil)
  77. c.Assert(resolvedName, chk.Equals, "bucket-2-name-2")
  78. // Names don't need resolve
  79. resolvedName, err = r.ResolveName("bucket-name")
  80. c.Assert(err, chk.IsNil)
  81. c.Assert(resolvedName, chk.Equals, "bucket-name")
  82. resolvedName, err = r.ResolveName("bucket-name-2")
  83. c.Assert(err, chk.IsNil)
  84. c.Assert(resolvedName, chk.Equals, "bucket-name-2")
  85. resolvedName, err = r.ResolveName("bucket-name-3")
  86. c.Assert(err, chk.IsNil)
  87. c.Assert(resolvedName, chk.Equals, "bucket-name-3")
  88. resolvedName, err = r.ResolveName("bucket-2-name")
  89. c.Assert(err, chk.IsNil)
  90. c.Assert(resolvedName, chk.Equals, "bucket-2-name")
  91. resolvedName, err = r.ResolveName("bucket-2-name-3")
  92. c.Assert(err, chk.IsNil)
  93. c.Assert(resolvedName, chk.Equals, "bucket-2-name-3")
  94. resolvedName, err = r.ResolveName("bucket.compose----name.1---hello")
  95. c.Assert(err, chk.IsNil)
  96. c.Assert(resolvedName, chk.Equals, "bucket-compose-4-name-1-3-hello")
  97. resolvedNameCollision1, err := r.ResolveName("a.b---c")
  98. c.Assert(err, chk.IsNil)
  99. resolvedNameCollision2, err := r.ResolveName("a-b---c")
  100. c.Assert(err, chk.IsNil)
  101. c.Assert(common.Iffint8(resolvedNameCollision1 == "a-b-3-c", 1, 0)^common.Iffint8(resolvedNameCollision2 == "a-b-3-c", 1, 0), chk.Equals, int8(1))
  102. c.Assert(common.Iffint8(resolvedNameCollision1 == "a-b-3-c-2", 1, 0)^common.Iffint8(resolvedNameCollision2 == "a-b-3-c-2", 1, 0), chk.Equals, int8(1))
  103. }
  104. func (s *s3NameResolverTestSuite) TestS3BucketNameToAzureResourceResolverNegative(c *chk.C) {
  105. r := NewS3BucketNameToAzureResourcesResolver([]string{"0123456789.0123456789.0123456789.012345678901234567890123456789", "0123456789-0123456789-0123456789-012345678901234567890123456789"}) // with length 64
  106. _, err := r.ResolveName("0123456789.0123456789.0123456789.012345678901234567890123456789")
  107. c.Assert(err, chk.NotNil)
  108. c.Assert(
  109. strings.Contains(err.Error(), "invalid for the destination"),
  110. chk.Equals,
  111. true)
  112. r = NewS3BucketNameToAzureResourcesResolver([]string{"0123456789--0123456789-0123456789012345678901234567890123456789"})
  113. _, err = r.ResolveName("0123456789--0123456789-0123456789012345678901234567890123456789")
  114. c.Assert(err, chk.NotNil)
  115. c.Assert(
  116. strings.Contains(err.Error(), "invalid for the destination"),
  117. chk.Equals,
  118. true)
  119. r = NewS3BucketNameToAzureResourcesResolver([]string{"namea"})
  120. _, err = r.ResolveName("specialnewnameb")
  121. c.Assert(err, chk.IsNil) // Bucket resolver now supports new names being injected
  122. }