enrollmentkey_test.go 6.5 KB

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