2
0

enrollmentkey_test.go 7.3 KB

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