Skip to content
Snippets Groups Projects
device_manager_test.go 4.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • takt's avatar
    takt committed
    package server
    
    import (
    	"testing"
    
    	"github.com/bio-routing/bio-rd/config"
    	"github.com/bio-routing/bio-rd/protocols/device"
    	"github.com/stretchr/testify/assert"
    )
    
    func TestRemoveDevice(t *testing.T) {
    	tests := []struct {
    		name           string
    
    takt's avatar
    takt committed
    		removeName     string
    		wantFail       bool
    
    		expected       *devicesManager
    
    takt's avatar
    takt committed
    		wantUnregister bool
    	}{
    		{
    			name: "Remove existing",
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{},
    				},
    
    takt's avatar
    takt committed
    						done: make(chan struct{}),
    						sys:  &mockSys{},
    						name: "foobar",
    					},
    				},
    			},
    			removeName: "foobar",
    
    			expected: &devicesManager{
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{
    						UnsubscribeCalled: true,
    						UnsubscribeName:   "foobar",
    					},
    				},
    
    takt's avatar
    takt committed
    			},
    			wantUnregister: true,
    		},
    		{
    			name: "Remove non-existing",
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{},
    				},
    
    takt's avatar
    takt committed
    						done: make(chan struct{}),
    						sys:  &mockSys{},
    						name: "foobar",
    					},
    				},
    			},
    			removeName: "baz",
    
    			expected: &devicesManager{
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{},
    				},
    
    takt's avatar
    takt committed
    						done: make(chan struct{}),
    						sys:  &mockSys{},
    						name: "foobar",
    					},
    				},
    			},
    			wantUnregister: false,
    			wantFail:       true,
    		},
    		{
    			name: "Remove existing - disable fails",
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{},
    				},
    
    takt's avatar
    takt committed
    						done: make(chan struct{}),
    						sys: &mockSys{
    							wantFailClosedPacketSocket: true,
    						},
    						name: "foobar",
    					},
    				},
    			},
    			removeName: "foobar",
    
    			expected: &devicesManager{
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{
    						UnsubscribeCalled: true,
    						UnsubscribeName:   "foobar",
    					},
    				},
    
    takt's avatar
    takt committed
    			},
    			wantUnregister: true,
    			wantFail:       true,
    		},
    	}
    
    	for _, test := range tests {
    
    		err := test.dm.removeDevice(test.removeName)
    
    		assert.Equal(t, test.wantUnregister, test.dm.srv.ds.(*device.MockServer).UnsubscribeCalled, test.name)
    
    takt's avatar
    takt committed
    
    		if err != nil {
    			if test.wantFail {
    				continue
    			}
    
    			t.Errorf("Unexpected failure for test %q: %v", test.name, err)
    			continue
    		}
    
    		if test.wantFail {
    			t.Errorf("Unexpected success for test %q", test.name)
    		}
    
    		// Ignore some attributes
    
    		for i := range test.dm.db {
    			test.dm.db[i].self = nil
    			test.dm.db[i].srv = nil
    			test.dm.db[i].done = nil
    
    		assert.Equal(t, test.expected, test.dm, test.name)
    
    takt's avatar
    takt committed
    	}
    }
    
    func TestDeviceAddDevice(t *testing.T) {
    	tests := []struct {
    		name         string
    
    takt's avatar
    takt committed
    		addIfCfg     *config.ISISInterfaceConfig
    		wantFail     bool
    
    		expected     *devicesManager
    
    takt's avatar
    takt committed
    		wantRegister bool
    	}{
    		{
    			name: "Test #1",
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{},
    				},
    
    takt's avatar
    takt committed
    						name: "foobar",
    					},
    				},
    			},
    			addIfCfg: &config.ISISInterfaceConfig{
    				Name:    "baz",
    				Passive: true,
    				ISISLevel2Config: &config.ISISLevelConfig{
    					HelloInterval: 5,
    				},
    			},
    
    			expected: &devicesManager{
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{
    						Called: true,
    						Name:   "baz",
    					},
    				},
    
    takt's avatar
    takt committed
    						name: "foobar",
    					},
    
    Oliver Herms's avatar
    Oliver Herms committed
    						name:    "baz",
    						passive: true,
    
    takt's avatar
    takt committed
    						level2: &level{
    							HelloInterval: 5,
    						},
    					},
    				},
    			},
    			wantRegister: true,
    		},
    		{
    			name: "Test #2",
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{},
    				},
    
    takt's avatar
    takt committed
    						name: "foobar",
    					},
    				},
    			},
    			addIfCfg: &config.ISISInterfaceConfig{
    				Name:    "foobar",
    				Passive: true,
    			},
    
    			expected: &devicesManager{
    
    takt's avatar
    takt committed
    				srv: &Server{
    					ds: &device.MockServer{
    						Called: true,
    						Name:   "baz",
    					},
    				},
    
    takt's avatar
    takt committed
    						name: "foobar",
    					},
    				},
    			},
    			wantRegister: false,
    			wantFail:     true,
    		},
    	}
    
    	for _, test := range tests {
    
    		err := test.dm.addDevice(test.addIfCfg)
    
    		assert.Equal(t, test.wantRegister, test.dm.srv.ds.(*device.MockServer).Called, test.name)
    
    takt's avatar
    takt committed
    
    		if err != nil {
    			if test.wantFail {
    				continue
    			}
    
    			t.Errorf("Unexpected failure for test %q: %v", test.name, err)
    			continue
    		}
    
    		if test.wantFail {
    			t.Errorf("Unexpected success for test %q", test.name)
    		}
    
    		// Ignore some attributes
    
    		for i := range test.dm.db {
    			test.dm.db[i].self = nil
    			test.dm.db[i].srv = nil
    			test.dm.db[i].done = nil
    
    		assert.Equal(t, test.expected, test.dm, test.name)