enrollmentkey_test.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package logic
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/google/uuid"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestCreateEnrollmentKey(t *testing.T) {
  11. database.InitializeDatabase()
  12. defer database.CloseDB()
  13. t.Run("Can_Not_Create_Key", func(t *testing.T) {
  14. newKey, err := CreateEnrollmentKey(0, time.Time{}, nil, nil, false, uuid.Nil)
  15. assert.Nil(t, newKey)
  16. assert.NotNil(t, err)
  17. assert.ErrorIs(t, err, models.ErrInvalidEnrollmentKey)
  18. })
  19. t.Run("Can_Create_Key_Uses", func(t *testing.T) {
  20. newKey, err := CreateEnrollmentKey(1, time.Time{}, nil, nil, false, uuid.Nil)
  21. assert.Nil(t, err)
  22. assert.Equal(t, 1, newKey.UsesRemaining)
  23. assert.True(t, newKey.IsValid())
  24. })
  25. t.Run("Can_Create_Key_Time", func(t *testing.T) {
  26. newKey, err := CreateEnrollmentKey(0, time.Now().Add(time.Minute), nil, nil, false, uuid.Nil)
  27. assert.Nil(t, err)
  28. assert.True(t, newKey.IsValid())
  29. })
  30. t.Run("Can_Create_Key_Unlimited", func(t *testing.T) {
  31. newKey, err := CreateEnrollmentKey(0, time.Time{}, nil, nil, true, uuid.Nil)
  32. assert.Nil(t, err)
  33. assert.True(t, newKey.IsValid())
  34. })
  35. t.Run("Can_Create_Key_WithNetworks", func(t *testing.T) {
  36. newKey, err := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
  37. assert.Nil(t, err)
  38. assert.True(t, newKey.IsValid())
  39. assert.True(t, len(newKey.Networks) == 2)
  40. })
  41. t.Run("Can_Create_Key_WithTags", func(t *testing.T) {
  42. newKey, err := CreateEnrollmentKey(0, time.Time{}, nil, []string{"tag1", "tag2"}, true, uuid.Nil)
  43. assert.Nil(t, err)
  44. assert.True(t, newKey.IsValid())
  45. assert.True(t, len(newKey.Tags) == 2)
  46. })
  47. t.Run("Can_Get_List_of_Keys", func(t *testing.T) {
  48. keys, err := GetAllEnrollmentKeys()
  49. assert.Nil(t, err)
  50. assert.True(t, len(keys) > 0)
  51. for i := range keys {
  52. assert.Equal(t, len(keys[i].Value), models.EnrollmentKeyLength)
  53. }
  54. })
  55. removeAllEnrollments()
  56. }
  57. func TestDelete_EnrollmentKey(t *testing.T) {
  58. database.InitializeDatabase()
  59. defer database.CloseDB()
  60. newKey, _ := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
  61. t.Run("Can_Delete_Key", func(t *testing.T) {
  62. assert.True(t, newKey.IsValid())
  63. err := DeleteEnrollmentKey(newKey.Value)
  64. assert.Nil(t, err)
  65. oldKey, err := GetEnrollmentKey(newKey.Value)
  66. assert.Nil(t, oldKey)
  67. assert.NotNil(t, err)
  68. assert.Equal(t, err, EnrollmentErrors.NoKeyFound)
  69. })
  70. t.Run("Can_Not_Delete_Invalid_Key", func(t *testing.T) {
  71. err := DeleteEnrollmentKey("notakey")
  72. assert.NotNil(t, err)
  73. assert.Equal(t, err, EnrollmentErrors.NoKeyFound)
  74. })
  75. removeAllEnrollments()
  76. }
  77. func TestDecrement_EnrollmentKey(t *testing.T) {
  78. database.InitializeDatabase()
  79. defer database.CloseDB()
  80. newKey, _ := CreateEnrollmentKey(1, time.Time{}, nil, nil, false, uuid.Nil)
  81. t.Run("Check_initial_uses", func(t *testing.T) {
  82. assert.True(t, newKey.IsValid())
  83. assert.Equal(t, newKey.UsesRemaining, 1)
  84. })
  85. t.Run("Check can decrement", func(t *testing.T) {
  86. assert.Equal(t, newKey.UsesRemaining, 1)
  87. k, err := decrementEnrollmentKey(newKey.Value)
  88. assert.Nil(t, err)
  89. newKey = k
  90. })
  91. t.Run("Check can not decrement", func(t *testing.T) {
  92. assert.Equal(t, newKey.UsesRemaining, 0)
  93. _, err := decrementEnrollmentKey(newKey.Value)
  94. assert.NotNil(t, err)
  95. assert.Equal(t, err, EnrollmentErrors.NoUsesRemaining)
  96. })
  97. removeAllEnrollments()
  98. }
  99. func TestUsability_EnrollmentKey(t *testing.T) {
  100. database.InitializeDatabase()
  101. defer database.CloseDB()
  102. key1, _ := CreateEnrollmentKey(1, time.Time{}, nil, nil, false, uuid.Nil)
  103. key2, _ := CreateEnrollmentKey(0, time.Now().Add(time.Minute<<4), nil, nil, false, uuid.Nil)
  104. key3, _ := CreateEnrollmentKey(0, time.Time{}, nil, nil, true, uuid.Nil)
  105. t.Run("Check if valid use key can be used", func(t *testing.T) {
  106. assert.Equal(t, key1.UsesRemaining, 1)
  107. ok := TryToUseEnrollmentKey(key1)
  108. assert.True(t, ok)
  109. assert.Equal(t, 0, key1.UsesRemaining)
  110. })
  111. t.Run("Check if valid time key can be used", func(t *testing.T) {
  112. assert.True(t, !key2.Expiration.IsZero())
  113. ok := TryToUseEnrollmentKey(key2)
  114. assert.True(t, ok)
  115. })
  116. t.Run("Check if valid unlimited key can be used", func(t *testing.T) {
  117. assert.True(t, key3.Unlimited)
  118. ok := TryToUseEnrollmentKey(key3)
  119. assert.True(t, ok)
  120. })
  121. t.Run("check invalid key can not be used", func(t *testing.T) {
  122. ok := TryToUseEnrollmentKey(key1)
  123. assert.False(t, ok)
  124. })
  125. }
  126. func removeAllEnrollments() {
  127. database.DeleteAllRecords(database.ENROLLMENT_KEYS_TABLE_NAME)
  128. }
  129. //Test that cheks if it can tokenize
  130. //Test that cheks if it can't tokenize
  131. func TestTokenize_EnrollmentKeys(t *testing.T) {
  132. database.InitializeDatabase()
  133. defer database.CloseDB()
  134. newKey, _ := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
  135. const defaultValue = "MwE5MwE5MwE5MwE5MwE5MwE5MwE5MwE5"
  136. const b64value = "eyJzZXJ2ZXIiOiJhcGkubXlzZXJ2ZXIuY29tIiwidmFsdWUiOiJNd0U1TXdFNU13RTVNd0U1TXdFNU13RTVNd0U1TXdFNSJ9"
  137. const serverAddr = "api.myserver.com"
  138. t.Run("Can_Not_Tokenize_Nil_Key", func(t *testing.T) {
  139. err := Tokenize(nil, "ServerAddress")
  140. assert.NotNil(t, err)
  141. assert.Equal(t, err, EnrollmentErrors.FailedToTokenize)
  142. })
  143. t.Run("Can_Not_Tokenize_Empty_Server_Address", func(t *testing.T) {
  144. err := Tokenize(newKey, "")
  145. assert.NotNil(t, err)
  146. assert.Equal(t, err, EnrollmentErrors.FailedToTokenize)
  147. })
  148. t.Run("Can_Tokenize", func(t *testing.T) {
  149. err := Tokenize(newKey, serverAddr)
  150. assert.Nil(t, err)
  151. assert.True(t, len(newKey.Token) > 0)
  152. })
  153. t.Run("Is_Correct_B64_Token", func(t *testing.T) {
  154. newKey.Value = defaultValue
  155. err := Tokenize(newKey, serverAddr)
  156. assert.Nil(t, err)
  157. assert.Equal(t, newKey.Token, b64value)
  158. })
  159. removeAllEnrollments()
  160. }
  161. func TestDeTokenize_EnrollmentKeys(t *testing.T) {
  162. database.InitializeDatabase()
  163. defer database.CloseDB()
  164. newKey, _ := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
  165. const b64Value = "eyJzZXJ2ZXIiOiJhcGkubXlzZXJ2ZXIuY29tIiwidmFsdWUiOiJNd0U1TXdFNU13RTVNd0U1TXdFNU13RTVNd0U1TXdFNSJ9"
  166. const serverAddr = "api.myserver.com"
  167. t.Run("Can_Not_DeTokenize", func(t *testing.T) {
  168. value, err := DeTokenize("")
  169. assert.Nil(t, value)
  170. assert.NotNil(t, err)
  171. assert.Equal(t, err, EnrollmentErrors.FailedToDeTokenize)
  172. })
  173. t.Run("Can_Not_Find_Key", func(t *testing.T) {
  174. value, err := DeTokenize(b64Value)
  175. assert.Nil(t, value)
  176. assert.NotNil(t, err)
  177. assert.Equal(t, err, EnrollmentErrors.NoKeyFound)
  178. })
  179. t.Run("Can_DeTokenize", func(t *testing.T) {
  180. err := Tokenize(newKey, serverAddr)
  181. assert.Nil(t, err)
  182. output, err := DeTokenize(newKey.Token)
  183. assert.Nil(t, err)
  184. assert.NotNil(t, output)
  185. assert.Equal(t, newKey.Value, output.Value)
  186. })
  187. removeAllEnrollments()
  188. }