github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/tests/integration/connection_secure_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package integration
     5  
     6  import (
     7  	"context"
     8  	"crypto/tls"
     9  	"fmt"
    10  	"os"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/ydb-platform/ydb-go-genproto/Ydb_Discovery_V1"
    15  	"github.com/ydb-platform/ydb-go-genproto/Ydb_Export_V1"
    16  	"github.com/ydb-platform/ydb-go-genproto/Ydb_Scripting_V1"
    17  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
    18  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Discovery"
    19  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Export"
    20  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Operations"
    21  	"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Scripting"
    22  	"google.golang.org/protobuf/proto"
    23  	"google.golang.org/protobuf/types/known/durationpb"
    24  
    25  	"github.com/ydb-platform/ydb-go-sdk/v3"
    26  	"github.com/ydb-platform/ydb-go-sdk/v3/config"
    27  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest"
    28  	"github.com/ydb-platform/ydb-go-sdk/v3/retry"
    29  	"github.com/ydb-platform/ydb-go-sdk/v3/trace"
    30  )
    31  
    32  //nolint:gocyclo
    33  func TestConnectionSecure(sourceTest *testing.T) {
    34  	t := xtest.MakeSyncedTest(sourceTest)
    35  	dsn, has := os.LookupEnv("YDB_CONNECTION_STRING_SECURE")
    36  	if !has {
    37  		t.Skipf("require YDB_CONNECTION_STRING_SECURE env")
    38  	}
    39  
    40  	const sumColumn = "sum"
    41  	ctx := xtest.Context(t)
    42  
    43  	db, err := ydb.Open(ctx, dsn,
    44  		ydb.WithAccessTokenCredentials(
    45  			os.Getenv("YDB_ACCESS_TOKEN_CREDENTIALS"),
    46  		),
    47  		ydb.With(
    48  			config.WithOperationTimeout(time.Second*2),
    49  			config.WithOperationCancelAfter(time.Second*2),
    50  		),
    51  		ydb.WithConnectionTTL(time.Millisecond*10000),
    52  		ydb.WithMinTLSVersion(tls.VersionTLS10),
    53  		ydb.WithLogger(
    54  			newLogger(t),
    55  			trace.MatchDetails(`ydb\.(driver|discovery|retry|scheme).*`),
    56  		),
    57  	)
    58  	if err != nil {
    59  		t.Fatal(err)
    60  	}
    61  	defer func() {
    62  		// cleanup connection
    63  		if e := db.Close(ctx); e != nil {
    64  			t.Fatalf("close failed: %+v", e)
    65  		}
    66  	}()
    67  	t.Run("discovery.WhoAmI", func(t *testing.T) {
    68  		if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
    69  			discoveryClient := Ydb_Discovery_V1.NewDiscoveryServiceClient(ydb.GRPCConn(db))
    70  			response, err := discoveryClient.WhoAmI(
    71  				ctx,
    72  				&Ydb_Discovery.WhoAmIRequest{IncludeGroups: true},
    73  			)
    74  			if err != nil {
    75  				return err
    76  			}
    77  			var result Ydb_Discovery.WhoAmIResult
    78  			err = proto.Unmarshal(response.GetOperation().GetResult().GetValue(), &result)
    79  			if err != nil {
    80  				return
    81  			}
    82  			return nil
    83  		}, retry.WithIdempotent(true)); err != nil {
    84  			t.Fatalf("Execute failed: %v", err)
    85  		}
    86  	})
    87  	t.Run("scripting.ExecuteYql", func(t *testing.T) {
    88  		if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
    89  			scriptingClient := Ydb_Scripting_V1.NewScriptingServiceClient(ydb.GRPCConn(db))
    90  			response, err := scriptingClient.ExecuteYql(
    91  				ctx,
    92  				&Ydb_Scripting.ExecuteYqlRequest{Script: "SELECT 1+100 AS sum"},
    93  			)
    94  			if err != nil {
    95  				return err
    96  			}
    97  			var result Ydb_Scripting.ExecuteYqlResult
    98  			err = proto.Unmarshal(response.GetOperation().GetResult().GetValue(), &result)
    99  			if err != nil {
   100  				return
   101  			}
   102  			if len(result.GetResultSets()) != 1 {
   103  				return fmt.Errorf(
   104  					"unexpected result sets count: %d",
   105  					len(result.GetResultSets()),
   106  				)
   107  			}
   108  			if len(result.GetResultSets()[0].GetColumns()) != 1 {
   109  				return fmt.Errorf(
   110  					"unexpected colums count: %d",
   111  					len(result.GetResultSets()[0].GetColumns()),
   112  				)
   113  			}
   114  			if result.GetResultSets()[0].GetColumns()[0].GetName() != sumColumn {
   115  				return fmt.Errorf(
   116  					"unexpected colum name: %s",
   117  					result.GetResultSets()[0].GetColumns()[0].GetName(),
   118  				)
   119  			}
   120  			if len(result.GetResultSets()[0].GetRows()) != 1 {
   121  				return fmt.Errorf(
   122  					"unexpected rows count: %d",
   123  					len(result.GetResultSets()[0].GetRows()),
   124  				)
   125  			}
   126  			if result.GetResultSets()[0].GetRows()[0].GetItems()[0].GetInt32Value() != 101 {
   127  				return fmt.Errorf(
   128  					"unexpected result of select: %d",
   129  					result.GetResultSets()[0].GetRows()[0].GetInt64Value(),
   130  				)
   131  			}
   132  			return nil
   133  		}, retry.WithIdempotent(true)); err != nil {
   134  			t.Fatalf("Execute failed: %v", err)
   135  		}
   136  	})
   137  	t.Run("scripting.StreamExecuteYql", func(t *testing.T) {
   138  		if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
   139  			scriptingClient := Ydb_Scripting_V1.NewScriptingServiceClient(ydb.GRPCConn(db))
   140  			client, err := scriptingClient.StreamExecuteYql(
   141  				ctx,
   142  				&Ydb_Scripting.ExecuteYqlRequest{Script: "SELECT 1+100 AS sum"},
   143  			)
   144  			if err != nil {
   145  				return err
   146  			}
   147  			response, err := client.Recv()
   148  			if err != nil {
   149  				return err
   150  			}
   151  			if len(response.GetResult().GetResultSet().GetColumns()) != 1 {
   152  				return fmt.Errorf(
   153  					"unexpected colums count: %d",
   154  					len(response.GetResult().GetResultSet().GetColumns()),
   155  				)
   156  			}
   157  			if response.GetResult().GetResultSet().GetColumns()[0].GetName() != sumColumn {
   158  				return fmt.Errorf(
   159  					"unexpected colum name: %s",
   160  					response.GetResult().GetResultSet().GetColumns()[0].GetName(),
   161  				)
   162  			}
   163  			if len(response.GetResult().GetResultSet().GetRows()) != 1 {
   164  				return fmt.Errorf(
   165  					"unexpected rows count: %d",
   166  					len(response.GetResult().GetResultSet().GetRows()),
   167  				)
   168  			}
   169  			if response.GetResult().GetResultSet().GetRows()[0].GetItems()[0].GetInt32Value() != 101 {
   170  				return fmt.Errorf(
   171  					"unexpected result of select: %d",
   172  					response.GetResult().GetResultSet().GetRows()[0].GetInt64Value(),
   173  				)
   174  			}
   175  			return nil
   176  		}, retry.WithIdempotent(true)); err != nil {
   177  			t.Fatalf("Stream execute failed: %v", err)
   178  		}
   179  	})
   180  	t.Run("with.scripting.StreamExecuteYql", func(t *testing.T) {
   181  		var childDB *ydb.Driver
   182  		childDB, err = db.With(
   183  			ctx,
   184  			ydb.WithDialTimeout(time.Second*5),
   185  		)
   186  		if err != nil {
   187  			t.Fatalf("failed to open sub-connection: %v", err)
   188  		}
   189  		defer func() {
   190  			_ = childDB.Close(ctx)
   191  		}()
   192  		if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
   193  			scriptingClient := Ydb_Scripting_V1.NewScriptingServiceClient(ydb.GRPCConn(childDB))
   194  			client, err := scriptingClient.StreamExecuteYql(
   195  				ctx,
   196  				&Ydb_Scripting.ExecuteYqlRequest{Script: "SELECT 1+100 AS sum"},
   197  			)
   198  			if err != nil {
   199  				return err
   200  			}
   201  			response, err := client.Recv()
   202  			if err != nil {
   203  				return err
   204  			}
   205  			if len(response.GetResult().GetResultSet().GetColumns()) != 1 {
   206  				return fmt.Errorf(
   207  					"unexpected colums count: %d",
   208  					len(response.GetResult().GetResultSet().GetColumns()),
   209  				)
   210  			}
   211  			if response.GetResult().GetResultSet().GetColumns()[0].GetName() != sumColumn {
   212  				return fmt.Errorf(
   213  					"unexpected colum name: %s",
   214  					response.GetResult().GetResultSet().GetColumns()[0].GetName(),
   215  				)
   216  			}
   217  			if len(response.GetResult().GetResultSet().GetRows()) != 1 {
   218  				return fmt.Errorf(
   219  					"unexpected rows count: %d",
   220  					len(response.GetResult().GetResultSet().GetRows()),
   221  				)
   222  			}
   223  			if response.GetResult().GetResultSet().GetRows()[0].GetItems()[0].GetInt32Value() != 101 {
   224  				return fmt.Errorf(
   225  					"unexpected result of select: %d",
   226  					response.GetResult().GetResultSet().GetRows()[0].GetInt64Value(),
   227  				)
   228  			}
   229  			return nil
   230  		}, retry.WithIdempotent(true)); err != nil {
   231  			t.Fatalf("Stream execute failed: %v", err)
   232  		}
   233  	})
   234  	t.Run("export.ExportToS3", func(t *testing.T) {
   235  		if err = retry.Retry(ctx, func(ctx context.Context) (err error) {
   236  			exportClient := Ydb_Export_V1.NewExportServiceClient(ydb.GRPCConn(db))
   237  			response, err := exportClient.ExportToS3(
   238  				ctx,
   239  				&Ydb_Export.ExportToS3Request{
   240  					OperationParams: &Ydb_Operations.OperationParams{
   241  						OperationTimeout: durationpb.New(time.Second),
   242  						CancelAfter:      durationpb.New(time.Second),
   243  					},
   244  					Settings: &Ydb_Export.ExportToS3Settings{},
   245  				},
   246  			)
   247  			if err != nil {
   248  				return err
   249  			}
   250  			if response.GetOperation().GetStatus() != Ydb.StatusIds_BAD_REQUEST {
   251  				return fmt.Errorf(
   252  					"operation must be BAD_REQUEST: %s",
   253  					response.GetOperation().GetStatus().String(),
   254  				)
   255  			}
   256  			return nil
   257  		}, retry.WithIdempotent(true)); err != nil {
   258  			t.Fatalf("check export failed: %v", err)
   259  		}
   260  	})
   261  }