vitess.io/vitess@v0.16.2/go/vt/vtgate/engine/dbddl_test.go (about)

     1  package engine
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  type dbddlTestFake struct {
    15  	createCalled, dropCalled bool
    16  	sleep                    int
    17  }
    18  
    19  func (d *dbddlTestFake) CreateDatabase(ctx context.Context, name string) error {
    20  	if d.sleep > 0 {
    21  		time.Sleep(time.Duration(d.sleep) * time.Second)
    22  	}
    23  	d.createCalled = true
    24  	return nil
    25  }
    26  
    27  func (d *dbddlTestFake) DropDatabase(ctx context.Context, name string) error {
    28  	if d.sleep > 0 {
    29  		time.Sleep(time.Duration(d.sleep) * time.Second)
    30  	}
    31  	d.dropCalled = true
    32  	return nil
    33  }
    34  
    35  var _ DBDDLPlugin = (*dbddlTestFake)(nil)
    36  
    37  func TestDBDDLCreateExecute(t *testing.T) {
    38  	pluginName := "createFake"
    39  	plugin := &dbddlTestFake{}
    40  	DBDDLRegister(pluginName, plugin)
    41  
    42  	primitive := &DBDDL{
    43  		name:   "ks",
    44  		create: true,
    45  	}
    46  
    47  	vc := &loggingVCursor{dbDDLPlugin: pluginName}
    48  
    49  	_, err := primitive.TryExecute(context.Background(), vc, nil, false)
    50  	require.NoError(t, err)
    51  	require.True(t, plugin.createCalled)
    52  	require.False(t, plugin.dropCalled)
    53  }
    54  
    55  func TestDBDDLDropExecute(t *testing.T) {
    56  	pluginName := "dropFake"
    57  	plugin := &dbddlTestFake{}
    58  	DBDDLRegister(pluginName, plugin)
    59  
    60  	primitive := &DBDDL{name: "ks"}
    61  
    62  	vc := &loggingVCursor{dbDDLPlugin: pluginName, ksAvailable: false}
    63  
    64  	_, err := primitive.TryExecute(context.Background(), vc, nil, false)
    65  	require.NoError(t, err)
    66  	require.False(t, plugin.createCalled)
    67  	require.True(t, plugin.dropCalled)
    68  }
    69  
    70  func TestDBDDLTimeout(t *testing.T) {
    71  	pluginName := "timeoutFake"
    72  	plugin := &dbddlTestFake{sleep: 2}
    73  	DBDDLRegister(pluginName, plugin)
    74  
    75  	primitive := &DBDDL{name: "ks", create: true, queryTimeout: 100}
    76  	vc := &loggingVCursor{dbDDLPlugin: pluginName, shardErr: fmt.Errorf("db not available")}
    77  	_, err := primitive.TryExecute(context.Background(), vc, nil, false)
    78  	assert.EqualError(t, err, "could not validate create database: destination not resolved")
    79  
    80  	primitive = &DBDDL{name: "ks", queryTimeout: 100}
    81  	vc = &loggingVCursor{dbDDLPlugin: pluginName, ksAvailable: true}
    82  	_, err = primitive.TryExecute(context.Background(), vc, nil, false)
    83  	assert.EqualError(t, err, "could not validate drop database: keyspace still available in vschema")
    84  }