mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
package boltdb
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"path"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
)
 | 
						|
 | 
						|
func Test_NeedsEncryptionMigration(t *testing.T) {
 | 
						|
	// Test the specific scenarios mentioned in NeedsEncryptionMigration
 | 
						|
 | 
						|
	// i.e.
 | 
						|
	// Cases:  Note, we need to check both portainer.db and portainer.edb
 | 
						|
	// to determine if it's a new store.   We only need to differentiate between cases 2,3 and 5
 | 
						|
 | 
						|
	// 1) portainer.edb + key     => False
 | 
						|
	// 2) portainer.edb + no key  => ERROR Fatal!
 | 
						|
	// 3) portainer.db  + key     => True  (needs migration)
 | 
						|
	// 4) portainer.db  + no key  => False
 | 
						|
	// 5) NoDB (new)    + key     => False
 | 
						|
	// 6) NoDB (new)    + no key  => False
 | 
						|
	// 7) portainer.db & portainer.edb (key not important) => ERROR Fatal!
 | 
						|
 | 
						|
	is := assert.New(t)
 | 
						|
	dir := t.TempDir()
 | 
						|
 | 
						|
	cases := []struct {
 | 
						|
		name         string
 | 
						|
		dbname       string
 | 
						|
		key          bool
 | 
						|
		expectError  error
 | 
						|
		expectResult bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			name:         "portainer.edb + key",
 | 
						|
			dbname:       EncryptedDatabaseFileName,
 | 
						|
			key:          true,
 | 
						|
			expectError:  nil,
 | 
						|
			expectResult: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "portainer.db + key (migration needed)",
 | 
						|
			dbname:       DatabaseFileName,
 | 
						|
			key:          true,
 | 
						|
			expectError:  nil,
 | 
						|
			expectResult: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "portainer.db + no key",
 | 
						|
			dbname:       DatabaseFileName,
 | 
						|
			key:          false,
 | 
						|
			expectError:  nil,
 | 
						|
			expectResult: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "NoDB (new) + key",
 | 
						|
			dbname:       "",
 | 
						|
			key:          false,
 | 
						|
			expectError:  nil,
 | 
						|
			expectResult: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "NoDB (new) + no key",
 | 
						|
			dbname:       "",
 | 
						|
			key:          false,
 | 
						|
			expectError:  nil,
 | 
						|
			expectResult: false,
 | 
						|
		},
 | 
						|
 | 
						|
		// error tests
 | 
						|
		{
 | 
						|
			name:         "portainer.edb + no key",
 | 
						|
			dbname:       EncryptedDatabaseFileName,
 | 
						|
			key:          false,
 | 
						|
			expectError:  ErrHaveEncryptedWithNoKey,
 | 
						|
			expectResult: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "portainer.db & portainer.edb",
 | 
						|
			dbname:       "both",
 | 
						|
			key:          true,
 | 
						|
			expectError:  ErrHaveEncryptedAndUnencrypted,
 | 
						|
			expectResult: false,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range cases {
 | 
						|
		tc := tc
 | 
						|
 | 
						|
		t.Run(tc.name, func(t *testing.T) {
 | 
						|
 | 
						|
			connection := DbConnection{Path: dir}
 | 
						|
 | 
						|
			if tc.dbname == "both" {
 | 
						|
				// Special case.  If portainer.db and portainer.edb exist.
 | 
						|
				dbFile1 := path.Join(connection.Path, DatabaseFileName)
 | 
						|
				f, _ := os.Create(dbFile1)
 | 
						|
				f.Close()
 | 
						|
				defer os.Remove(dbFile1)
 | 
						|
 | 
						|
				dbFile2 := path.Join(connection.Path, EncryptedDatabaseFileName)
 | 
						|
				f, _ = os.Create(dbFile2)
 | 
						|
				f.Close()
 | 
						|
				defer os.Remove(dbFile2)
 | 
						|
			} else if tc.dbname != "" {
 | 
						|
				dbFile := path.Join(connection.Path, tc.dbname)
 | 
						|
				f, _ := os.Create(dbFile)
 | 
						|
				f.Close()
 | 
						|
				defer os.Remove(dbFile)
 | 
						|
			}
 | 
						|
 | 
						|
			if tc.key {
 | 
						|
				connection.EncryptionKey = []byte("secret")
 | 
						|
			}
 | 
						|
 | 
						|
			result, err := connection.NeedsEncryptionMigration()
 | 
						|
 | 
						|
			is.Equal(tc.expectError, err, "Fatal Error failure. Test: %s", tc.name)
 | 
						|
			is.Equal(result, tc.expectResult, "Failed test: %s", tc.name)
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 |