mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 21:17:43 +09:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package policy
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/google/go-cmp/cmp"
 | |
| 	"github.com/juanfont/headscale/hscontrol/types"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| 	"gorm.io/gorm"
 | |
| 	"tailscale.com/tailcfg"
 | |
| )
 | |
| 
 | |
| func TestPolicySetChange(t *testing.T) {
 | |
| 	users := []types.User{
 | |
| 		{
 | |
| 			Model: gorm.Model{ID: 1},
 | |
| 			Name:  "testuser",
 | |
| 		},
 | |
| 	}
 | |
| 	tests := []struct {
 | |
| 		name             string
 | |
| 		users            []types.User
 | |
| 		nodes            types.Nodes
 | |
| 		policy           []byte
 | |
| 		wantUsersChange  bool
 | |
| 		wantNodesChange  bool
 | |
| 		wantPolicyChange bool
 | |
| 		wantFilter       []tailcfg.FilterRule
 | |
| 	}{
 | |
| 		{
 | |
| 			name: "set-nodes",
 | |
| 			nodes: types.Nodes{
 | |
| 				{
 | |
| 					IPv4: iap("100.64.0.2"),
 | |
| 					User: users[0],
 | |
| 				},
 | |
| 			},
 | |
| 			wantNodesChange: false,
 | |
| 			wantFilter: []tailcfg.FilterRule{
 | |
| 				{
 | |
| 					DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.1/32", Ports: tailcfg.PortRangeAny}},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name:            "set-users",
 | |
| 			users:           users,
 | |
| 			wantUsersChange: false,
 | |
| 			wantFilter: []tailcfg.FilterRule{
 | |
| 				{
 | |
| 					DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.1/32", Ports: tailcfg.PortRangeAny}},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name:  "set-users-and-node",
 | |
| 			users: users,
 | |
| 			nodes: types.Nodes{
 | |
| 				{
 | |
| 					IPv4: iap("100.64.0.2"),
 | |
| 					User: users[0],
 | |
| 				},
 | |
| 			},
 | |
| 			wantUsersChange: false,
 | |
| 			wantNodesChange: true,
 | |
| 			wantFilter: []tailcfg.FilterRule{
 | |
| 				{
 | |
| 					SrcIPs:   []string{"100.64.0.2/32"},
 | |
| 					DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.1/32", Ports: tailcfg.PortRangeAny}},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "set-policy",
 | |
| 			policy: []byte(`
 | |
| {
 | |
| "acls": [
 | |
| 		{
 | |
| 			"action": "accept",
 | |
| 			"src": [
 | |
| 				"100.64.0.61",
 | |
| 			],
 | |
| 			"dst": [
 | |
| 				"100.64.0.62:*",
 | |
| 			],
 | |
| 		},
 | |
| 		],
 | |
| }
 | |
| 				`),
 | |
| 			wantPolicyChange: true,
 | |
| 			wantFilter: []tailcfg.FilterRule{
 | |
| 				{
 | |
| 					SrcIPs:   []string{"100.64.0.61/32"},
 | |
| 					DstPorts: []tailcfg.NetPortRange{{IP: "100.64.0.62/32", Ports: tailcfg.PortRangeAny}},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			pol := `
 | |
| {
 | |
| 	"groups": {
 | |
| 		"group:example": [
 | |
| 			"testuser",
 | |
| 		],
 | |
| 	},
 | |
| 
 | |
| 	"hosts": {
 | |
| 		"host-1": "100.64.0.1",
 | |
| 		"subnet-1": "100.100.101.100/24",
 | |
| 	},
 | |
| 
 | |
| 	"acls": [
 | |
| 		{
 | |
| 			"action": "accept",
 | |
| 			"src": [
 | |
| 				"group:example",
 | |
| 			],
 | |
| 			"dst": [
 | |
| 				"host-1:*",
 | |
| 			],
 | |
| 		},
 | |
| 	],
 | |
| }
 | |
| `
 | |
| 			pm, err := NewPolicyManager([]byte(pol), []types.User{}, types.Nodes{})
 | |
| 			require.NoError(t, err)
 | |
| 
 | |
| 			if tt.policy != nil {
 | |
| 				change, err := pm.SetPolicy(tt.policy)
 | |
| 				require.NoError(t, err)
 | |
| 
 | |
| 				assert.Equal(t, tt.wantPolicyChange, change)
 | |
| 			}
 | |
| 
 | |
| 			if tt.users != nil {
 | |
| 				change, err := pm.SetUsers(tt.users)
 | |
| 				require.NoError(t, err)
 | |
| 
 | |
| 				assert.Equal(t, tt.wantUsersChange, change)
 | |
| 			}
 | |
| 
 | |
| 			if tt.nodes != nil {
 | |
| 				change, err := pm.SetNodes(tt.nodes)
 | |
| 				require.NoError(t, err)
 | |
| 
 | |
| 				assert.Equal(t, tt.wantNodesChange, change)
 | |
| 			}
 | |
| 
 | |
| 			if diff := cmp.Diff(tt.wantFilter, pm.Filter()); diff != "" {
 | |
| 				t.Errorf("TestPolicySetChange() unexpected result (-want +got):\n%s", diff)
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |