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 }