Newer
Older
wg-portal / internal / wireguard / backend_file_test.go
@Christoph Haas Christoph Haas on 28 Aug 2021 4 KB WIP: tests
package wireguard

import (
	"bytes"
	"io"
	"io/ioutil"
	"os"
	"path/filepath"
	"reflect"
	"strings"
	"testing"

	"github.com/pkg/errors"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/mock"
	"github.com/stretchr/testify/require"
)

type MockFileGenerator struct {
	mock.Mock
}

func (m *MockFileGenerator) GetInterfaceConfig(cfg InterfaceConfig, peers []PeerConfig) (io.Reader, error) {
	args := m.Called(cfg, peers)
	return args.Get(0).(io.Reader), args.Error(1)
}

func (m *MockFileGenerator) GetPeerConfig(peer PeerConfig, iface InterfaceConfig) (io.Reader, error) {
	args := m.Called(peer, iface)
	return args.Get(0).(io.Reader), args.Error(1)
}

func TestFileBackend_DeleteInterface(t *testing.T) {
	// setup
	tmpDir := os.TempDir()
	tmpFile, err := ioutil.TempFile(tmpDir, "wg*.conf")
	require.NoError(t, err)
	defer os.Remove(tmpFile.Name())

	f := FileBackend{
		configurationPath: tmpDir,
	}

	// Successful delete
	err = f.DeleteInterface(InterfaceConfig{
		DeviceName: DeviceIdentifier(strings.ReplaceAll(filepath.Base(tmpFile.Name()), ".conf", "")),
	}, nil)
	assert.NoError(t, err)

	// Unsuccessful delete
	err = f.DeleteInterface(InterfaceConfig{
		DeviceName: DeviceIdentifier(strings.ReplaceAll(filepath.Base(tmpFile.Name()), ".conf", "")),
	}, nil)
	assert.Error(t, err)
}

func TestFileBackend_DeletePeer(t *testing.T) {
	assert.NoError(t, FileBackend{}.DeletePeer(PeerConfig{}, InterfaceConfig{}))
}

func TestFileBackend_Load(t *testing.T) {
	type fields struct {
		configurationPath string
		fileGenerator     ConfigFileGenerator
	}
	type args struct {
		identifier DeviceIdentifier
	}
	tests := []struct {
		name    string
		fields  fields
		args    args
		want    InterfaceConfig
		want1   []PeerConfig
		wantErr bool
	}{
		// TODO: Add test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			f := FileBackend{
				configurationPath: tt.fields.configurationPath,
				fileGenerator:     tt.fields.fileGenerator,
			}
			got, got1, err := f.Load(tt.args.identifier)
			if (err != nil) != tt.wantErr {
				t.Errorf("Load() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("Load() got = %v, want %v", got, tt.want)
			}
			if !reflect.DeepEqual(got1, tt.want1) {
				t.Errorf("Load() got1 = %v, want %v", got1, tt.want1)
			}
		})
	}
}

func TestFileBackend_LoadAll(t *testing.T) {
	type fields struct {
		configurationPath string
		fileGenerator     ConfigFileGenerator
	}
	type args struct {
		ignored []DeviceIdentifier
	}
	tests := []struct {
		name    string
		fields  fields
		args    args
		want    map[InterfaceConfig][]PeerConfig
		wantErr bool
	}{
		// TODO: Add test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			f := FileBackend{
				configurationPath: tt.fields.configurationPath,
				fileGenerator:     tt.fields.fileGenerator,
			}
			got, err := f.LoadAll(tt.args.ignored...)
			if (err != nil) != tt.wantErr {
				t.Errorf("LoadAll() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("LoadAll() got = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestFileBackend_SaveInterface(t *testing.T) {
	// setup
	tmpDir := os.TempDir()
	tmpFile, err := ioutil.TempFile(tmpDir, "wg*.conf")
	require.NoError(t, err)
	defer os.Remove(tmpFile.Name())
	deviceName := strings.ReplaceAll(filepath.Base(tmpFile.Name()), ".conf", "")

	type fields struct {
		prepare func(m *mock.Mock)
	}
	type args struct {
		cfg   InterfaceConfig
		peers []PeerConfig
	}
	tests := []struct {
		name    string
		fields  fields
		args    args
		wantErr bool
	}{
		{
			name: "FileGeneratorError",
			fields: fields{
				prepare: func(m *mock.Mock) {
					m.On("GetInterfaceConfig", mock.Anything, mock.Anything).
						Return(&bytes.Buffer{}, errors.New("generr"))
				},
			},
			args:    args{},
			wantErr: true,
		},
		{
			name: "Success",
			fields: fields{
				prepare: func(m *mock.Mock) {
					m.On("GetInterfaceConfig", mock.Anything, mock.Anything).
						Return(bytes.NewBuffer([]byte("hello world")), nil)
				},
			},
			args: args{
				cfg:   InterfaceConfig{DeviceName: DeviceIdentifier(deviceName)},
				peers: nil,
			},
			wantErr: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			fg := new(MockFileGenerator)
			f := FileBackend{
				configurationPath: tmpDir,
				fileGenerator:     fg,
			}
			tt.fields.prepare(&fg.Mock)
			if err := f.SaveInterface(tt.args.cfg, tt.args.peers); (err != nil) != tt.wantErr {
				t.Errorf("SaveInterface() error = %v, wantErr %v", err, tt.wantErr)
			}

			fg.AssertExpectations(t)
		})
	}
}

func TestFileBackend_SavePeer(t *testing.T) {
	assert.NoError(t, FileBackend{}.SavePeer(PeerConfig{}, InterfaceConfig{}))
}

func TestNewFileBackend(t *testing.T) {
	got, err := NewFileBackend("testing", nil)
	assert.NoError(t, err)
	assert.NotNil(t, got)
}