github.com/pingcap/tidb/parser@v0.0.0-20231013125129-93a834a6bf8d/mysql/privs_test.go (about)

     1  // Copyright 2021 PingCAP, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package mysql
    15  
    16  import (
    17  	"testing"
    18  
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestPrivString(t *testing.T) {
    23  	for i := 0; ; i++ {
    24  		p := PrivilegeType(1 << i)
    25  		if p > AllPriv {
    26  			break
    27  		}
    28  		require.NotEqualf(t, "", p.String(), "%d-th", i)
    29  	}
    30  }
    31  
    32  func TestPrivColumn(t *testing.T) {
    33  	for _, p := range AllGlobalPrivs {
    34  		require.NotEmptyf(t, p.ColumnString(), "%s", p)
    35  		np, ok := NewPrivFromColumn(p.ColumnString())
    36  		require.Truef(t, ok, "%s", p)
    37  		require.Equal(t, p, np)
    38  	}
    39  	for _, p := range StaticGlobalOnlyPrivs {
    40  		require.NotEmptyf(t, p.ColumnString(), "%s", p)
    41  		np, ok := NewPrivFromColumn(p.ColumnString())
    42  		require.Truef(t, ok, "%s", p)
    43  		require.Equal(t, p, np)
    44  	}
    45  	for _, p := range AllDBPrivs {
    46  		require.NotEmptyf(t, p.ColumnString(), "%s", p)
    47  		np, ok := NewPrivFromColumn(p.ColumnString())
    48  		require.Truef(t, ok, "%s", p)
    49  		require.Equal(t, p, np)
    50  	}
    51  }
    52  
    53  func TestPrivSetString(t *testing.T) {
    54  	for _, p := range AllTablePrivs {
    55  		require.NotEmptyf(t, p.SetString(), "%s", p)
    56  		np, ok := NewPrivFromSetEnum(p.SetString())
    57  		require.Truef(t, ok, "%s", p)
    58  		require.Equal(t, p, np)
    59  	}
    60  	for _, p := range AllColumnPrivs {
    61  		require.NotEmptyf(t, p.SetString(), "%s", p)
    62  		np, ok := NewPrivFromSetEnum(p.SetString())
    63  		require.Truef(t, ok, "%s", p)
    64  		require.Equal(t, p, np)
    65  	}
    66  }
    67  
    68  func TestPrivsHas(t *testing.T) {
    69  	// it is a simple helper, does not handle all&dynamic privs
    70  	privs := Privileges{AllPriv}
    71  	require.True(t, privs.Has(AllPriv))
    72  	require.False(t, privs.Has(InsertPriv))
    73  
    74  	// multiple privs
    75  	privs = Privileges{InsertPriv, SelectPriv}
    76  	require.True(t, privs.Has(SelectPriv))
    77  	require.True(t, privs.Has(InsertPriv))
    78  	require.False(t, privs.Has(DropPriv))
    79  }
    80  
    81  func TestPrivAllConsistency(t *testing.T) {
    82  	// AllPriv in mysql.user columns.
    83  	for priv := CreatePriv; priv != AllPriv; priv = priv << 1 {
    84  		_, ok := Priv2UserCol[priv]
    85  		require.Truef(t, ok, "priv fail %d", priv)
    86  	}
    87  
    88  	require.Equal(t, len(AllGlobalPrivs)+1, len(Priv2UserCol))
    89  
    90  	// USAGE privilege doesn't have a column in Priv2UserCol
    91  	// ALL privilege doesn't have a column in Priv2UserCol
    92  	// so it's +2
    93  	require.Equal(t, len(Priv2UserCol)+2, len(Priv2Str))
    94  }