mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-10-31 04:06:37 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			208 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package logic
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/google/uuid"
 | |
| 	"github.com/gravitl/netmaker/database"
 | |
| 	"github.com/gravitl/netmaker/models"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| )
 | |
| 
 | |
| func TestCreateEnrollmentKey(t *testing.T) {
 | |
| 	database.InitializeDatabase()
 | |
| 	defer database.CloseDB()
 | |
| 	t.Run("Can_Not_Create_Key", func(t *testing.T) {
 | |
| 		newKey, err := CreateEnrollmentKey(0, time.Time{}, nil, nil, false, uuid.Nil)
 | |
| 		assert.Nil(t, newKey)
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.ErrorIs(t, err, models.ErrInvalidEnrollmentKey)
 | |
| 	})
 | |
| 	t.Run("Can_Create_Key_Uses", func(t *testing.T) {
 | |
| 		newKey, err := CreateEnrollmentKey(1, time.Time{}, nil, nil, false, uuid.Nil)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.Equal(t, 1, newKey.UsesRemaining)
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 	})
 | |
| 	t.Run("Can_Create_Key_Time", func(t *testing.T) {
 | |
| 		newKey, err := CreateEnrollmentKey(0, time.Now().Add(time.Minute), nil, nil, false, uuid.Nil)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 	})
 | |
| 	t.Run("Can_Create_Key_Unlimited", func(t *testing.T) {
 | |
| 		newKey, err := CreateEnrollmentKey(0, time.Time{}, nil, nil, true, uuid.Nil)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 	})
 | |
| 	t.Run("Can_Create_Key_WithNetworks", func(t *testing.T) {
 | |
| 		newKey, err := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 		assert.True(t, len(newKey.Networks) == 2)
 | |
| 	})
 | |
| 	t.Run("Can_Create_Key_WithTags", func(t *testing.T) {
 | |
| 		newKey, err := CreateEnrollmentKey(0, time.Time{}, nil, []string{"tag1", "tag2"}, true, uuid.Nil)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 		assert.True(t, len(newKey.Tags) == 2)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("Can_Get_List_of_Keys", func(t *testing.T) {
 | |
| 		keys, err := GetAllEnrollmentKeys()
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.True(t, len(keys) > 0)
 | |
| 		for i := range keys {
 | |
| 			assert.Equal(t, len(keys[i].Value), models.EnrollmentKeyLength)
 | |
| 		}
 | |
| 	})
 | |
| 	removeAllEnrollments()
 | |
| }
 | |
| 
 | |
| func TestDelete_EnrollmentKey(t *testing.T) {
 | |
| 	database.InitializeDatabase()
 | |
| 	defer database.CloseDB()
 | |
| 	newKey, _ := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
 | |
| 	t.Run("Can_Delete_Key", func(t *testing.T) {
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 		err := DeleteEnrollmentKey(newKey.Value)
 | |
| 		assert.Nil(t, err)
 | |
| 		oldKey, err := GetEnrollmentKey(newKey.Value)
 | |
| 		assert.Nil(t, oldKey)
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.NoKeyFound)
 | |
| 	})
 | |
| 	t.Run("Can_Not_Delete_Invalid_Key", func(t *testing.T) {
 | |
| 		err := DeleteEnrollmentKey("notakey")
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.NoKeyFound)
 | |
| 	})
 | |
| 	removeAllEnrollments()
 | |
| }
 | |
| 
 | |
| func TestDecrement_EnrollmentKey(t *testing.T) {
 | |
| 	database.InitializeDatabase()
 | |
| 	defer database.CloseDB()
 | |
| 	newKey, _ := CreateEnrollmentKey(1, time.Time{}, nil, nil, false, uuid.Nil)
 | |
| 	t.Run("Check_initial_uses", func(t *testing.T) {
 | |
| 		assert.True(t, newKey.IsValid())
 | |
| 		assert.Equal(t, newKey.UsesRemaining, 1)
 | |
| 	})
 | |
| 	t.Run("Check can decrement", func(t *testing.T) {
 | |
| 		assert.Equal(t, newKey.UsesRemaining, 1)
 | |
| 		k, err := decrementEnrollmentKey(newKey.Value)
 | |
| 		assert.Nil(t, err)
 | |
| 		newKey = k
 | |
| 	})
 | |
| 	t.Run("Check can not decrement", func(t *testing.T) {
 | |
| 		assert.Equal(t, newKey.UsesRemaining, 0)
 | |
| 		_, err := decrementEnrollmentKey(newKey.Value)
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.NoUsesRemaining)
 | |
| 	})
 | |
| 
 | |
| 	removeAllEnrollments()
 | |
| }
 | |
| 
 | |
| func TestUsability_EnrollmentKey(t *testing.T) {
 | |
| 	database.InitializeDatabase()
 | |
| 	defer database.CloseDB()
 | |
| 	key1, _ := CreateEnrollmentKey(1, time.Time{}, nil, nil, false, uuid.Nil)
 | |
| 	key2, _ := CreateEnrollmentKey(0, time.Now().Add(time.Minute<<4), nil, nil, false, uuid.Nil)
 | |
| 	key3, _ := CreateEnrollmentKey(0, time.Time{}, nil, nil, true, uuid.Nil)
 | |
| 	t.Run("Check if valid use key can be used", func(t *testing.T) {
 | |
| 		assert.Equal(t, key1.UsesRemaining, 1)
 | |
| 		ok := TryToUseEnrollmentKey(key1)
 | |
| 		assert.True(t, ok)
 | |
| 		assert.Equal(t, 0, key1.UsesRemaining)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("Check if valid time key can be used", func(t *testing.T) {
 | |
| 		assert.True(t, !key2.Expiration.IsZero())
 | |
| 		ok := TryToUseEnrollmentKey(key2)
 | |
| 		assert.True(t, ok)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("Check if valid unlimited key can be used", func(t *testing.T) {
 | |
| 		assert.True(t, key3.Unlimited)
 | |
| 		ok := TryToUseEnrollmentKey(key3)
 | |
| 		assert.True(t, ok)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("check invalid key can not be used", func(t *testing.T) {
 | |
| 		ok := TryToUseEnrollmentKey(key1)
 | |
| 		assert.False(t, ok)
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func removeAllEnrollments() {
 | |
| 	database.DeleteAllRecords(database.ENROLLMENT_KEYS_TABLE_NAME)
 | |
| }
 | |
| 
 | |
| //Test that cheks if it can tokenize
 | |
| //Test that cheks if it can't tokenize
 | |
| 
 | |
| func TestTokenize_EnrollmentKeys(t *testing.T) {
 | |
| 	database.InitializeDatabase()
 | |
| 	defer database.CloseDB()
 | |
| 	newKey, _ := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
 | |
| 	const defaultValue = "MwE5MwE5MwE5MwE5MwE5MwE5MwE5MwE5"
 | |
| 	const b64value = "eyJzZXJ2ZXIiOiJhcGkubXlzZXJ2ZXIuY29tIiwidmFsdWUiOiJNd0U1TXdFNU13RTVNd0U1TXdFNU13RTVNd0U1TXdFNSJ9"
 | |
| 	const serverAddr = "api.myserver.com"
 | |
| 	t.Run("Can_Not_Tokenize_Nil_Key", func(t *testing.T) {
 | |
| 		err := Tokenize(nil, "ServerAddress")
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.FailedToTokenize)
 | |
| 	})
 | |
| 	t.Run("Can_Not_Tokenize_Empty_Server_Address", func(t *testing.T) {
 | |
| 		err := Tokenize(newKey, "")
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.FailedToTokenize)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("Can_Tokenize", func(t *testing.T) {
 | |
| 		err := Tokenize(newKey, serverAddr)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.True(t, len(newKey.Token) > 0)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("Is_Correct_B64_Token", func(t *testing.T) {
 | |
| 		newKey.Value = defaultValue
 | |
| 		err := Tokenize(newKey, serverAddr)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.Equal(t, newKey.Token, b64value)
 | |
| 	})
 | |
| 	removeAllEnrollments()
 | |
| }
 | |
| 
 | |
| func TestDeTokenize_EnrollmentKeys(t *testing.T) {
 | |
| 	database.InitializeDatabase()
 | |
| 	defer database.CloseDB()
 | |
| 	newKey, _ := CreateEnrollmentKey(0, time.Time{}, []string{"mynet", "skynet"}, nil, true, uuid.Nil)
 | |
| 	const b64Value = "eyJzZXJ2ZXIiOiJhcGkubXlzZXJ2ZXIuY29tIiwidmFsdWUiOiJNd0U1TXdFNU13RTVNd0U1TXdFNU13RTVNd0U1TXdFNSJ9"
 | |
| 	const serverAddr = "api.myserver.com"
 | |
| 
 | |
| 	t.Run("Can_Not_DeTokenize", func(t *testing.T) {
 | |
| 		value, err := DeTokenize("")
 | |
| 		assert.Nil(t, value)
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.FailedToDeTokenize)
 | |
| 	})
 | |
| 	t.Run("Can_Not_Find_Key", func(t *testing.T) {
 | |
| 		value, err := DeTokenize(b64Value)
 | |
| 		assert.Nil(t, value)
 | |
| 		assert.NotNil(t, err)
 | |
| 		assert.Equal(t, err, EnrollmentErrors.NoKeyFound)
 | |
| 	})
 | |
| 	t.Run("Can_DeTokenize", func(t *testing.T) {
 | |
| 		err := Tokenize(newKey, serverAddr)
 | |
| 		assert.Nil(t, err)
 | |
| 		output, err := DeTokenize(newKey.Token)
 | |
| 		assert.Nil(t, err)
 | |
| 		assert.NotNil(t, output)
 | |
| 		assert.Equal(t, newKey.Value, output.Value)
 | |
| 	})
 | |
| 
 | |
| 	removeAllEnrollments()
 | |
| }
 | 
