From 35c828fe2524a95a00b3071e5d440eda2590789c Mon Sep 17 00:00:00 2001 From: rick Date: Wed, 26 Feb 2025 21:54:05 +0800 Subject: [PATCH] feat: support to show databases and tables --- console/atest-ui/src/views/DataManager.vue | 4 +- pkg/runner/monitor/monitor.pb.go | 2 +- pkg/runner/monitor/monitor_grpc.pb.go | 2 +- pkg/server/remote_server.go | 2102 ++++++++++---------- pkg/server/server.pb.go | 978 +++++---- pkg/server/server.pb.gw.go | 314 ++- pkg/server/server.proto | 7 + pkg/server/server_grpc.pb.go | 2 +- pkg/testing/loader.go | 10 +- pkg/testing/loader_file.go | 4 +- pkg/testing/loader_non.go | 2 +- pkg/testing/remote/grpc_store.go | 399 ++-- pkg/testing/remote/loader.pb.go | 2 +- pkg/testing/remote/loader_grpc.pb.go | 2 +- 14 files changed, 2069 insertions(+), 1761 deletions(-) diff --git a/console/atest-ui/src/views/DataManager.vue b/console/atest-ui/src/views/DataManager.vue index 2005c7d..149c397 100644 --- a/console/atest-ui/src/views/DataManager.vue +++ b/console/atest-ui/src/views/DataManager.vue @@ -46,7 +46,7 @@ const ormDataHandler = (data) => { const result = [] const cols = new Set() - data.items.forEach(e => { + data.Rows.forEach(e => { const obj = {} e.data.forEach(item => { obj[item.key] = item.value @@ -65,7 +65,7 @@ const ormDataHandler = (data) => { const keyValueDataHandler = (data) => { queryResult.value = [] - data.data.forEach(e => { + data.Pairs.forEach(e => { const obj = {} obj['key'] = e.key obj['value'] = e.value diff --git a/pkg/runner/monitor/monitor.pb.go b/pkg/runner/monitor/monitor.pb.go index c7c582f..0d08cb6 100644 --- a/pkg/runner/monitor/monitor.pb.go +++ b/pkg/runner/monitor/monitor.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v4.25.1 +// protoc v4.22.2 // source: pkg/runner/monitor/monitor.proto package monitor diff --git a/pkg/runner/monitor/monitor_grpc.pb.go b/pkg/runner/monitor/monitor_grpc.pb.go index e7dcfaa..662f57d 100644 --- a/pkg/runner/monitor/monitor_grpc.pb.go +++ b/pkg/runner/monitor/monitor_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v4.25.1 +// - protoc v4.22.2 // source: pkg/runner/monitor/monitor.proto package monitor diff --git a/pkg/server/remote_server.go b/pkg/server/remote_server.go index a12e3ff..86985ed 100644 --- a/pkg/server/remote_server.go +++ b/pkg/server/remote_server.go @@ -17,73 +17,73 @@ limitations under the License. package server import ( - "bytes" - "context" - "errors" - "fmt" - "io" - "mime" - "net/http" - "os" - "path/filepath" - reflect "reflect" - "regexp" - "strconv" - "strings" - "time" + "bytes" + "context" + "errors" + "fmt" + "io" + "mime" + "net/http" + "os" + "path/filepath" + reflect "reflect" + "regexp" + "strconv" + "strings" + "time" - "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/builtin" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/linuxsuren/api-testing/pkg/util/home" + "github.com/linuxsuren/api-testing/pkg/util/home" - "github.com/linuxsuren/api-testing/pkg/mock" + "github.com/linuxsuren/api-testing/pkg/mock" - _ "embed" + _ "embed" - "github.com/linuxsuren/api-testing/pkg/generator" - "github.com/linuxsuren/api-testing/pkg/logging" - "github.com/linuxsuren/api-testing/pkg/oauth" - "github.com/linuxsuren/api-testing/pkg/render" - "github.com/linuxsuren/api-testing/pkg/runner" - "github.com/linuxsuren/api-testing/pkg/testing" - "github.com/linuxsuren/api-testing/pkg/util" - "github.com/linuxsuren/api-testing/pkg/version" - "github.com/linuxsuren/api-testing/sample" + "github.com/linuxsuren/api-testing/pkg/generator" + "github.com/linuxsuren/api-testing/pkg/logging" + "github.com/linuxsuren/api-testing/pkg/oauth" + "github.com/linuxsuren/api-testing/pkg/render" + "github.com/linuxsuren/api-testing/pkg/runner" + "github.com/linuxsuren/api-testing/pkg/testing" + "github.com/linuxsuren/api-testing/pkg/util" + "github.com/linuxsuren/api-testing/pkg/version" + "github.com/linuxsuren/api-testing/sample" - "google.golang.org/grpc/metadata" - "gopkg.in/yaml.v3" + "google.golang.org/grpc/metadata" + "gopkg.in/yaml.v3" ) var ( - remoteServerLogger = logging.DefaultLogger(logging.LogLevelInfo).WithName("remote_server") - GrpcMaxRecvMsgSize int + remoteServerLogger = logging.DefaultLogger(logging.LogLevelInfo).WithName("remote_server") + GrpcMaxRecvMsgSize int ) type server struct { - UnimplementedRunnerServer - UnimplementedDataServerServer - loader testing.Writer - storeWriterFactory testing.StoreWriterFactory - configDir string - storeExtMgr ExtManager + UnimplementedRunnerServer + UnimplementedDataServerServer + loader testing.Writer + storeWriterFactory testing.StoreWriterFactory + configDir string + storeExtMgr ExtManager - secretServer SecretServiceServer + secretServer SecretServiceServer - grpcMaxRecvMsgSize int + grpcMaxRecvMsgSize int } type SecretServiceServer interface { - GetSecrets(context.Context, *Empty) (*Secrets, error) - CreateSecret(context.Context, *Secret) (*CommonResult, error) - DeleteSecret(context.Context, *Secret) (*CommonResult, error) - UpdateSecret(context.Context, *Secret) (*CommonResult, error) + GetSecrets(context.Context, *Empty) (*Secrets, error) + CreateSecret(context.Context, *Secret) (*CommonResult, error) + DeleteSecret(context.Context, *Secret) (*CommonResult, error) + UpdateSecret(context.Context, *Secret) (*CommonResult, error) } type SecertServiceGetable interface { - GetSecret(context.Context, *Secret) (*Secret, error) + GetSecret(context.Context, *Secret) (*Secret, error) } type fakeSecretServer struct{} @@ -91,1326 +91,1330 @@ type fakeSecretServer struct{} var errNoSecretService = errors.New("no secret service found") func (f *fakeSecretServer) GetSecrets(ctx context.Context, in *Empty) (reply *Secrets, err error) { - err = errNoSecretService - return + err = errNoSecretService + return } func (f *fakeSecretServer) CreateSecret(ctx context.Context, in *Secret) (reply *CommonResult, err error) { - err = errNoSecretService - return + err = errNoSecretService + return } func (f *fakeSecretServer) DeleteSecret(ctx context.Context, in *Secret) (reply *CommonResult, err error) { - err = errNoSecretService - return + err = errNoSecretService + return } func (f *fakeSecretServer) UpdateSecret(ctx context.Context, in *Secret) (reply *CommonResult, err error) { - err = errNoSecretService - return + err = errNoSecretService + return } // NewRemoteServer creates a remote server instance func NewRemoteServer(loader testing.Writer, storeWriterFactory testing.StoreWriterFactory, secretServer SecretServiceServer, storeExtMgr ExtManager, configDir string, grpcMaxRecvMsgSize int) RunnerServer { - if secretServer == nil { - secretServer = &fakeSecretServer{} - } - GrpcMaxRecvMsgSize = grpcMaxRecvMsgSize - return &server{ - loader: loader, - storeWriterFactory: storeWriterFactory, - configDir: configDir, - secretServer: secretServer, - storeExtMgr: storeExtMgr, - grpcMaxRecvMsgSize: grpcMaxRecvMsgSize, - } + if secretServer == nil { + secretServer = &fakeSecretServer{} + } + GrpcMaxRecvMsgSize = grpcMaxRecvMsgSize + return &server{ + loader: loader, + storeWriterFactory: storeWriterFactory, + configDir: configDir, + secretServer: secretServer, + storeExtMgr: storeExtMgr, + grpcMaxRecvMsgSize: grpcMaxRecvMsgSize, + } } func withDefaultValue(old, defVal any) any { - if old == "" || old == nil { - old = defVal - } - return old + if old == "" || old == nil { + old = defVal + } + return old } func parseSuiteWithItems(data []byte) (suite *testing.TestSuite, err error) { - suite, err = testing.ParseFromData(data) - if err == nil && (suite == nil || suite.Items == nil) { - err = errNoTestSuiteFound - } - return + suite, err = testing.ParseFromData(data) + if err == nil && (suite == nil || suite.Items == nil) { + err = errNoTestSuiteFound + } + return } func (s *server) getSuiteFromTestTask(task *TestTask) (suite *testing.TestSuite, err error) { - switch task.Kind { - case "suite": - suite, err = parseSuiteWithItems([]byte(task.Data)) - case "testcase": - var testCase *testing.TestCase - if testCase, err = testing.ParseTestCaseFromData([]byte(task.Data)); err != nil { - return - } - suite = &testing.TestSuite{ - Items: []testing.TestCase{*testCase}, - } - case "testcaseInSuite": - suite, err = parseSuiteWithItems([]byte(task.Data)) - if err != nil { - return - } + switch task.Kind { + case "suite": + suite, err = parseSuiteWithItems([]byte(task.Data)) + case "testcase": + var testCase *testing.TestCase + if testCase, err = testing.ParseTestCaseFromData([]byte(task.Data)); err != nil { + return + } + suite = &testing.TestSuite{ + Items: []testing.TestCase{*testCase}, + } + case "testcaseInSuite": + suite, err = parseSuiteWithItems([]byte(task.Data)) + if err != nil { + return + } - var targetTestcase *testing.TestCase - for _, item := range suite.Items { - if item.Name == task.CaseName { - targetTestcase = &item - break - } - } + var targetTestcase *testing.TestCase + for _, item := range suite.Items { + if item.Name == task.CaseName { + targetTestcase = &item + break + } + } - if targetTestcase != nil { - parentCases := findParentTestCases(targetTestcase, suite) - remoteServerLogger.Info("find parent cases", "num", len(parentCases)) - suite.Items = append(parentCases, *targetTestcase) - } else { - err = fmt.Errorf("cannot found testcase %s", task.CaseName) - } - default: - err = fmt.Errorf("not support '%s'", task.Kind) - } - return + if targetTestcase != nil { + parentCases := findParentTestCases(targetTestcase, suite) + remoteServerLogger.Info("find parent cases", "num", len(parentCases)) + suite.Items = append(parentCases, *targetTestcase) + } else { + err = fmt.Errorf("cannot found testcase %s", task.CaseName) + } + default: + err = fmt.Errorf("not support '%s'", task.Kind) + } + return } func resetEnv(oldEnv map[string]string) { - for key, val := range oldEnv { - os.Setenv(key, val) - } + for key, val := range oldEnv { + os.Setenv(key, val) + } } func (s *server) getLoader(ctx context.Context) (loader testing.Writer) { - var ok bool - loader = s.loader + var ok bool + loader = s.loader - var mdd metadata.MD - if mdd, ok = metadata.FromIncomingContext(ctx); ok { - storeNameMeta := mdd.Get(HeaderKeyStoreName) - if len(storeNameMeta) > 0 { - storeName := strings.TrimSpace(storeNameMeta[0]) - if storeName == "local" || storeName == "" { - return - } + var mdd metadata.MD + if mdd, ok = metadata.FromIncomingContext(ctx); ok { + storeNameMeta := mdd.Get(HeaderKeyStoreName) + if len(storeNameMeta) > 0 { + storeName := strings.TrimSpace(storeNameMeta[0]) + if storeName == "local" || storeName == "" { + return + } - var err error - if loader, err = s.getLoaderByStoreName(storeName); err != nil { - remoteServerLogger.Info("failed to get loader", "name", storeName, "error", err) - loader = testing.NewNonWriter() - } - } - } - return + var err error + if loader, err = s.getLoaderByStoreName(storeName); err != nil { + remoteServerLogger.Info("failed to get loader", "name", storeName, "error", err) + loader = testing.NewNonWriter() + } + } + } + return } // Run start to run the test task func (s *server) Run(ctx context.Context, task *TestTask) (reply *TestResult, err error) { - task.Level = withDefaultValue(task.Level, "info").(string) - task.Env = withDefaultValue(task.Env, map[string]string{}).(map[string]string) + task.Level = withDefaultValue(task.Level, "info").(string) + task.Env = withDefaultValue(task.Env, map[string]string{}).(map[string]string) - var suite *testing.TestSuite - // TODO may not safe in multiple threads - oldEnv := map[string]string{} - for key, val := range task.Env { - oldEnv[key] = os.Getenv(key) - os.Setenv(key, val) - } + var suite *testing.TestSuite + // TODO may not safe in multiple threads + oldEnv := map[string]string{} + for key, val := range task.Env { + oldEnv[key] = os.Getenv(key) + os.Setenv(key, val) + } - defer func() { - resetEnv(oldEnv) - }() + defer func() { + resetEnv(oldEnv) + }() - if suite, err = s.getSuiteFromTestTask(task); err != nil { - return - } + if suite, err = s.getSuiteFromTestTask(task); err != nil { + return + } - remoteServerLogger.Info("prepare to run", "name", suite.Name, " with level: ", task.Level) - remoteServerLogger.Info("task kind to run", "kind", task.Kind, "lens", len(suite.Items)) - dataContext := map[string]interface{}{} + remoteServerLogger.Info("prepare to run", "name", suite.Name, " with level: ", task.Level) + remoteServerLogger.Info("task kind to run", "kind", task.Kind, "lens", len(suite.Items)) + dataContext := map[string]interface{}{} - if err = suite.Render(dataContext); err != nil { - reply.Error = err.Error() - err = nil - return - } - // inject the parameters from input - if len(task.Parameters) > 0 { - dataContext[testing.ContextKeyGlobalParam] = pairToMap(task.Parameters) - } + if err = suite.Render(dataContext); err != nil { + reply.Error = err.Error() + err = nil + return + } + // inject the parameters from input + if len(task.Parameters) > 0 { + dataContext[testing.ContextKeyGlobalParam] = pairToMap(task.Parameters) + } - buf := new(bytes.Buffer) - reply = &TestResult{} + buf := new(bytes.Buffer) + reply = &TestResult{} - for _, testCase := range suite.Items { - suiteRunner := runner.GetTestSuiteRunner(suite) - suiteRunner.WithOutputWriter(buf) - suiteRunner.WithWriteLevel(task.Level) - suiteRunner.WithSecure(suite.Spec.Secure) - suiteRunner.WithSuite(suite) + for _, testCase := range suite.Items { + suiteRunner := runner.GetTestSuiteRunner(suite) + suiteRunner.WithOutputWriter(buf) + suiteRunner.WithWriteLevel(task.Level) + suiteRunner.WithSecure(suite.Spec.Secure) + suiteRunner.WithSuite(suite) - // reuse the API prefix - testCase.Request.RenderAPI(suite.API) - historyHeader := make(map[string]string) - for k, v := range testCase.Request.Header { - historyHeader[k] = v - } + // reuse the API prefix + testCase.Request.RenderAPI(suite.API) + historyHeader := make(map[string]string) + for k, v := range testCase.Request.Header { + historyHeader[k] = v + } - output, testErr := suiteRunner.RunTestCase(&testCase, dataContext, ctx) - if getter, ok := suiteRunner.(runner.ResponseRecord); ok { - resp := getter.GetResponseRecord() - //resp, err = runner.HandleLargeResponseBody(resp, suite.Name, testCase.Name) - reply.TestCaseResult = append(reply.TestCaseResult, &TestCaseResult{ - StatusCode: int32(resp.StatusCode), - Body: resp.Body, - Header: mapToPair(resp.Header), - Id: testCase.ID, - Output: buf.String(), - }) - } + output, testErr := suiteRunner.RunTestCase(&testCase, dataContext, ctx) + if getter, ok := suiteRunner.(runner.ResponseRecord); ok { + resp := getter.GetResponseRecord() + //resp, err = runner.HandleLargeResponseBody(resp, suite.Name, testCase.Name) + reply.TestCaseResult = append(reply.TestCaseResult, &TestCaseResult{ + StatusCode: int32(resp.StatusCode), + Body: resp.Body, + Header: mapToPair(resp.Header), + Id: testCase.ID, + Output: buf.String(), + }) + } - if testErr == nil { - dataContext[testCase.Name] = output - } else { - reply.Error = testErr.Error() - break - } - // create history record - go func(historyHeader map[string]string) { - loader := s.getLoader(ctx) - defer loader.Close() - for _, testCaseResult := range reply.TestCaseResult { - err = loader.CreateHistoryTestCase(ToNormalTestCaseResult(testCaseResult), suite, historyHeader) - if err != nil { - remoteServerLogger.Info("error create history") - } - } - }(historyHeader) - } + if testErr == nil { + dataContext[testCase.Name] = output + } else { + reply.Error = testErr.Error() + break + } + // create history record + go func(historyHeader map[string]string) { + loader := s.getLoader(ctx) + defer loader.Close() + for _, testCaseResult := range reply.TestCaseResult { + err = loader.CreateHistoryTestCase(ToNormalTestCaseResult(testCaseResult), suite, historyHeader) + if err != nil { + remoteServerLogger.Info("error create history") + } + } + }(historyHeader) + } - if reply.Error != "" { - fmt.Fprintln(buf, reply.Error) - } - reply.Message = buf.String() - return + if reply.Error != "" { + fmt.Fprintln(buf, reply.Error) + } + reply.Message = buf.String() + return } func (s *server) BatchRun(srv Runner_BatchRunServer) (err error) { - ctx := srv.Context() - for { - select { - case <-ctx.Done(): - return ctx.Err() - default: - var in *BatchTestTask - in, err = srv.Recv() - if err != nil { - if err == io.EOF { - return nil - } - return err - } + ctx := srv.Context() + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + var in *BatchTestTask + in, err = srv.Recv() + if err != nil { + if err == io.EOF { + return nil + } + return err + } - for i := 0; i < int(in.Count); i++ { - var reply *TestCaseResult - if reply, err = s.RunTestCase(ctx, &TestCaseIdentity{ - Suite: in.SuiteName, - Testcase: in.CaseName, - }); err != nil { - return - } + for i := 0; i < int(in.Count); i++ { + var reply *TestCaseResult + if reply, err = s.RunTestCase(ctx, &TestCaseIdentity{ + Suite: in.SuiteName, + Testcase: in.CaseName, + }); err != nil { + return + } - if err = srv.Send(&TestResult{ - TestCaseResult: []*TestCaseResult{reply}, - Error: reply.Error, - }); err != nil { - return err - } + if err = srv.Send(&TestResult{ + TestCaseResult: []*TestCaseResult{reply}, + Error: reply.Error, + }); err != nil { + return err + } - var interval string - if interval, err = render.Render("batch run interval", in.Interval, nil); err != nil { - return - } + var interval string + if interval, err = render.Render("batch run interval", in.Interval, nil); err != nil { + return + } - var duration time.Duration - if duration, err = time.ParseDuration(interval); err != nil { - return - } - time.Sleep(duration) - } - } - } + var duration time.Duration + if duration, err = time.ParseDuration(interval); err != nil { + return + } + time.Sleep(duration) + } + } + } } func (s *server) DownloadResponseFile(ctx context.Context, in *TestCase) (reply *FileData, err error) { - if in.Response != nil { - tempFileName := in.Response.Body - if tempFileName == "" { - return nil, errors.New("file name is empty") - } + if in.Response != nil { + tempFileName := in.Response.Body + if tempFileName == "" { + return nil, errors.New("file name is empty") + } - tempDir := os.TempDir() - filePath := filepath.Join(tempDir, tempFileName) - if filepath.Clean(filePath) != filepath.Join(tempDir, filepath.Base(tempFileName)) { - return nil, errors.New("invalid file path") - } + tempDir := os.TempDir() + filePath := filepath.Join(tempDir, tempFileName) + if filepath.Clean(filePath) != filepath.Join(tempDir, filepath.Base(tempFileName)) { + return nil, errors.New("invalid file path") + } - fmt.Println("get file from", filePath) - fileContent, err := os.ReadFile(filePath) - if err != nil { - return nil, fmt.Errorf("failed to read file: %s", filePath) - } + fmt.Println("get file from", filePath) + fileContent, err := os.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("failed to read file: %s", filePath) + } - mimeType := mime.TypeByExtension(filepath.Ext(filePath)) - if mimeType == "" { - mimeType = "application/octet-stream" - } + mimeType := mime.TypeByExtension(filepath.Ext(filePath)) + if mimeType == "" { + mimeType = "application/octet-stream" + } - filename := filepath.Base(filePath) - // try to get the original filename - var originalFileName []byte - if originalFileName, err = os.ReadFile(filePath + "name"); err == nil && len(originalFileName) > 0 { - filename = string(originalFileName) - } + filename := filepath.Base(filePath) + // try to get the original filename + var originalFileName []byte + if originalFileName, err = os.ReadFile(filePath + "name"); err == nil && len(originalFileName) > 0 { + filename = string(originalFileName) + } - reply = &FileData{ - Data: fileContent, - ContentType: mimeType, - Filename: filename, - } + reply = &FileData{ + Data: fileContent, + ContentType: mimeType, + Filename: filename, + } - return reply, nil - } else { - return reply, errors.New("response is empty") - } + return reply, nil + } else { + return reply, errors.New("response is empty") + } } func (s *server) RunTestSuite(srv Runner_RunTestSuiteServer) (err error) { - ctx := srv.Context() - for { - select { - case <-ctx.Done(): - return ctx.Err() - default: - var in *TestSuiteIdentity - in, err = srv.Recv() - if err != nil { - if err == io.EOF { - return nil - } - return err - } + ctx := srv.Context() + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + var in *TestSuiteIdentity + in, err = srv.Recv() + if err != nil { + if err == io.EOF { + return nil + } + return err + } - var suite *Suite - if suite, err = s.ListTestCase(ctx, in); err != nil { - return - } + var suite *Suite + if suite, err = s.ListTestCase(ctx, in); err != nil { + return + } - for _, item := range suite.Items { - var reply *TestCaseResult - if reply, err = s.RunTestCase(ctx, &TestCaseIdentity{ - Suite: in.Name, - Testcase: item.Name, - }); err != nil { - return - } + for _, item := range suite.Items { + var reply *TestCaseResult + if reply, err = s.RunTestCase(ctx, &TestCaseIdentity{ + Suite: in.Name, + Testcase: item.Name, + }); err != nil { + return + } - if err = srv.Send(&TestResult{ - TestCaseResult: []*TestCaseResult{reply}, - Error: reply.Error, - }); err != nil { - return err - } - } - } - } + if err = srv.Send(&TestResult{ + TestCaseResult: []*TestCaseResult{reply}, + Error: reply.Error, + }); err != nil { + return err + } + } + } + } } // GetVersion returns the version func (s *server) GetVersion(ctx context.Context, in *Empty) (reply *Version, err error) { - reply = &Version{ - Version: version.GetVersion(), - Date: version.GetDate(), - Commit: version.GetCommit(), - } - return + reply = &Version{ + Version: version.GetVersion(), + Date: version.GetDate(), + Commit: version.GetCommit(), + } + return } func (s *server) GetSuites(ctx context.Context, in *Empty) (reply *Suites, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &Suites{ - Data: make(map[string]*Items), - } + loader := s.getLoader(ctx) + defer loader.Close() + reply = &Suites{ + Data: make(map[string]*Items), + } - var suites []testing.TestSuite - if suites, err = loader.ListTestSuite(); err == nil && suites != nil { - for _, suite := range suites { - items := &Items{} - for _, item := range suite.Items { - items.Data = append(items.Data, item.Name) - } - items.Kind = suite.Spec.Kind - reply.Data[suite.Name] = items - } - } + var suites []testing.TestSuite + if suites, err = loader.ListTestSuite(); err == nil && suites != nil { + for _, suite := range suites { + items := &Items{} + for _, item := range suite.Items { + items.Data = append(items.Data, item.Name) + } + items.Kind = suite.Spec.Kind + reply.Data[suite.Name] = items + } + } - return + return } func (s *server) GetHistorySuites(ctx context.Context, in *Empty) (reply *HistorySuites, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &HistorySuites{ - Data: make(map[string]*HistoryItems), - } + loader := s.getLoader(ctx) + defer loader.Close() + reply = &HistorySuites{ + Data: make(map[string]*HistoryItems), + } - var suites []testing.HistoryTestSuite - if suites, err = loader.ListHistoryTestSuite(); err == nil && suites != nil { - for _, suite := range suites { - items := &HistoryItems{} - for _, item := range suite.Items { - data := &HistoryCaseIdentity{ - ID: item.ID, - HistorySuiteName: item.HistorySuiteName, - Kind: item.SuiteSpec.Kind, - Suite: item.SuiteName, - Testcase: item.CaseName, - } - items.Data = append(items.Data, data) - } - reply.Data[suite.HistorySuiteName] = items - } - } - return + var suites []testing.HistoryTestSuite + if suites, err = loader.ListHistoryTestSuite(); err == nil && suites != nil { + for _, suite := range suites { + items := &HistoryItems{} + for _, item := range suite.Items { + data := &HistoryCaseIdentity{ + ID: item.ID, + HistorySuiteName: item.HistorySuiteName, + Kind: item.SuiteSpec.Kind, + Suite: item.SuiteName, + Testcase: item.CaseName, + } + items.Data = append(items.Data, data) + } + reply.Data[suite.HistorySuiteName] = items + } + } + return } func (s *server) CreateTestSuite(ctx context.Context, in *TestSuiteIdentity) (reply *HelloReply, err error) { - reply = &HelloReply{} - loader := s.getLoader(ctx) - defer loader.Close() - if loader == nil { - reply.Error = "no loader found" - } else { - if err = loader.CreateSuite(in.Name, in.Api); err == nil { - toUpdate := testing.TestSuite{ - Name: in.Name, - API: in.Api, - Spec: testing.APISpec{ - Kind: in.Kind, - }, - } + reply = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() + if loader == nil { + reply.Error = "no loader found" + } else { + if err = loader.CreateSuite(in.Name, in.Api); err == nil { + toUpdate := testing.TestSuite{ + Name: in.Name, + API: in.Api, + Spec: testing.APISpec{ + Kind: in.Kind, + }, + } - switch strings.ToLower(in.Kind) { - case "grpc", "trpc": - toUpdate.Spec.RPC = &testing.RPCDesc{} - } + switch strings.ToLower(in.Kind) { + case "grpc", "trpc": + toUpdate.Spec.RPC = &testing.RPCDesc{} + } - err = loader.UpdateSuite(toUpdate) - } - } - return + err = loader.UpdateSuite(toUpdate) + } + } + return } func (s *server) ImportTestSuite(ctx context.Context, in *TestSuiteSource) (result *CommonResult, err error) { - result = &CommonResult{} - var dataImporter generator.Importer - switch in.Kind { - case "postman": - dataImporter = generator.NewPostmanImporter() - case "native", "": - dataImporter = generator.NewNativeImporter() - default: - result.Success = false - result.Message = fmt.Sprintf("not support kind: %s", in.Kind) - return - } + result = &CommonResult{} + var dataImporter generator.Importer + switch in.Kind { + case "postman": + dataImporter = generator.NewPostmanImporter() + case "native", "": + dataImporter = generator.NewNativeImporter() + default: + result.Success = false + result.Message = fmt.Sprintf("not support kind: %s", in.Kind) + return + } - remoteServerLogger.Logger.Info("import test suite", "kind", in.Kind, "url", in.Url) - var suite *testing.TestSuite - if in.Url != "" { - suite, err = dataImporter.ConvertFromURL(in.Url) - } else if in.Data != "" { - suite, err = dataImporter.Convert([]byte(in.Data)) - } else { - err = errors.New("url or data is required") - } + remoteServerLogger.Logger.Info("import test suite", "kind", in.Kind, "url", in.Url) + var suite *testing.TestSuite + if in.Url != "" { + suite, err = dataImporter.ConvertFromURL(in.Url) + } else if in.Data != "" { + suite, err = dataImporter.Convert([]byte(in.Data)) + } else { + err = errors.New("url or data is required") + } - if err != nil { - result.Success = false - result.Message = err.Error() - return - } + if err != nil { + result.Success = false + result.Message = err.Error() + return + } - loader := s.getLoader(ctx) - defer loader.Close() + loader := s.getLoader(ctx) + defer loader.Close() - if err = loader.CreateSuite(suite.Name, suite.API); err != nil { - return - } + if err = loader.CreateSuite(suite.Name, suite.API); err != nil { + return + } - for _, item := range suite.Items { - if err = loader.CreateTestCase(suite.Name, item); err != nil { - break - } - } - result.Success = true - return + for _, item := range suite.Items { + if err = loader.CreateTestCase(suite.Name, item); err != nil { + break + } + } + result.Success = true + return } func (s *server) GetTestSuite(ctx context.Context, in *TestSuiteIdentity) (result *TestSuite, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - var suite *testing.TestSuite - if suite, _, err = loader.GetSuite(in.Name); err == nil && suite != nil { - result = ToGRPCSuite(suite) - } - return + loader := s.getLoader(ctx) + defer loader.Close() + var suite *testing.TestSuite + if suite, _, err = loader.GetSuite(in.Name); err == nil && suite != nil { + result = ToGRPCSuite(suite) + } + return } func (s *server) UpdateTestSuite(ctx context.Context, in *TestSuite) (reply *HelloReply, err error) { - reply = &HelloReply{} - loader := s.getLoader(ctx) - defer loader.Close() - err = loader.UpdateSuite(*ToNormalSuite(in)) - return + reply = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() + err = loader.UpdateSuite(*ToNormalSuite(in)) + return } func (s *server) DeleteTestSuite(ctx context.Context, in *TestSuiteIdentity) (reply *HelloReply, err error) { - reply = &HelloReply{} - loader := s.getLoader(ctx) - defer loader.Close() - err = loader.DeleteSuite(in.Name) - return + reply = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() + err = loader.DeleteSuite(in.Name) + return } func (s *server) DuplicateTestSuite(ctx context.Context, in *TestSuiteDuplicate) (reply *HelloReply, err error) { - reply = &HelloReply{} - loader := s.getLoader(ctx) - defer loader.Close() + reply = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() - if in.SourceSuiteName == in.TargetSuiteName { - reply.Error = "source and target suite name should be different" - return - } + if in.SourceSuiteName == in.TargetSuiteName { + reply.Error = "source and target suite name should be different" + return + } - var suite testing.TestSuite - if suite, err = loader.GetTestSuite(in.SourceSuiteName, true); err == nil { - suite.Name = in.TargetSuiteName - if err = loader.CreateSuite(suite.Name, suite.API); err == nil { - for _, testCase := range suite.Items { - if err = loader.CreateTestCase(suite.Name, testCase); err != nil { - break - } - } - } - } - return + var suite testing.TestSuite + if suite, err = loader.GetTestSuite(in.SourceSuiteName, true); err == nil { + suite.Name = in.TargetSuiteName + if err = loader.CreateSuite(suite.Name, suite.API); err == nil { + for _, testCase := range suite.Items { + if err = loader.CreateTestCase(suite.Name, testCase); err != nil { + break + } + } + } + } + return } func (s *server) RenameTestSuite(ctx context.Context, in *TestSuiteDuplicate) (reply *HelloReply, err error) { - reply = &HelloReply{} - loader := s.getLoader(ctx) - defer loader.Close() - err = loader.RenameTestSuite(in.SourceSuiteName, in.TargetSuiteName) - return + reply = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() + err = loader.RenameTestSuite(in.SourceSuiteName, in.TargetSuiteName) + return } func (s *server) ListTestCase(ctx context.Context, in *TestSuiteIdentity) (result *Suite, err error) { - var items []testing.TestCase - loader := s.getLoader(ctx) - defer loader.Close() - if items, err = loader.ListTestCase(in.Name); err == nil { - result = &Suite{} - for _, item := range items { - result.Items = append(result.Items, ToGRPCTestCase(item)) - } - } - return + var items []testing.TestCase + loader := s.getLoader(ctx) + defer loader.Close() + if items, err = loader.ListTestCase(in.Name); err == nil { + result = &Suite{} + for _, item := range items { + result.Items = append(result.Items, ToGRPCTestCase(item)) + } + } + return } func (s *server) GetTestSuiteYaml(ctx context.Context, in *TestSuiteIdentity) (reply *YamlData, err error) { - var data []byte - loader := s.getLoader(ctx) - defer loader.Close() - if data, err = loader.GetTestSuiteYaml(in.Name); err == nil { - reply = &YamlData{ - Data: data, - } - } - return + var data []byte + loader := s.getLoader(ctx) + defer loader.Close() + if data, err = loader.GetTestSuiteYaml(in.Name); err == nil { + reply = &YamlData{ + Data: data, + } + } + return } func (s *server) GetTestCase(ctx context.Context, in *TestCaseIdentity) (reply *TestCase, err error) { - var result testing.TestCase - loader := s.getLoader(ctx) - defer loader.Close() - if result, err = loader.GetTestCase(in.Suite, in.Testcase); err == nil { - reply = ToGRPCTestCase(result) + var result testing.TestCase + loader := s.getLoader(ctx) + defer loader.Close() + if result, err = loader.GetTestCase(in.Suite, in.Testcase); err == nil { + reply = ToGRPCTestCase(result) - var suite testing.TestSuite - if suite, err = loader.GetTestSuite(in.Suite, false); err == nil { - reply.Server = suite.API - } - } - return + var suite testing.TestSuite + if suite, err = loader.GetTestSuite(in.Suite, false); err == nil { + reply.Server = suite.API + } + } + return } func (s *server) GetHistoryTestCaseWithResult(ctx context.Context, in *HistoryTestCase) (reply *HistoryTestResult, err error) { - var result testing.HistoryTestResult - loader := s.getLoader(ctx) - defer loader.Close() - if result, err = loader.GetHistoryTestCaseWithResult(in.ID); err == nil { - reply = ToGRPCHistoryTestCaseResult(result) - } - return + var result testing.HistoryTestResult + loader := s.getLoader(ctx) + defer loader.Close() + if result, err = loader.GetHistoryTestCaseWithResult(in.ID); err == nil { + reply = ToGRPCHistoryTestCaseResult(result) + } + return } func (s *server) GetHistoryTestCase(ctx context.Context, in *HistoryTestCase) (reply *HistoryTestCase, err error) { - var result testing.HistoryTestCase - loader := s.getLoader(ctx) - defer loader.Close() - if result, err = loader.GetHistoryTestCase(in.ID); err == nil { - reply = ConvertToGRPCHistoryTestCase(result) - } - return + var result testing.HistoryTestCase + loader := s.getLoader(ctx) + defer loader.Close() + if result, err = loader.GetHistoryTestCase(in.ID); err == nil { + reply = ConvertToGRPCHistoryTestCase(result) + } + return } var ExecutionCountNum = promauto.NewCounter(prometheus.CounterOpts{ - Name: "atest_execution_count", - Help: "The total number of request execution", + Name: "atest_execution_count", + Help: "The total number of request execution", }) var ExecutionSuccessNum = promauto.NewCounter(prometheus.CounterOpts{ - Name: "atest_execution_success", - Help: "The total number of request execution success", + Name: "atest_execution_success", + Help: "The total number of request execution success", }) var ExecutionFailNum = promauto.NewCounter(prometheus.CounterOpts{ - Name: "atest_execution_fail", - Help: "The total number of request execution fail", + Name: "atest_execution_fail", + Help: "The total number of request execution fail", }) func (s *server) GetTestCaseAllHistory(ctx context.Context, in *TestCase) (result *HistoryTestCases, err error) { - var items []testing.HistoryTestCase - loader := s.getLoader(ctx) - defer loader.Close() - if items, err = loader.GetTestCaseAllHistory(in.SuiteName, in.Name); err == nil { - result = &HistoryTestCases{} - for _, item := range items { - result.Data = append(result.Data, ConvertToGRPCHistoryTestCase(item)) - } - } - return + var items []testing.HistoryTestCase + loader := s.getLoader(ctx) + defer loader.Close() + if items, err = loader.GetTestCaseAllHistory(in.SuiteName, in.Name); err == nil { + result = &HistoryTestCases{} + for _, item := range items { + result.Data = append(result.Data, ConvertToGRPCHistoryTestCase(item)) + } + } + return } func (s *server) RunTestCase(ctx context.Context, in *TestCaseIdentity) (result *TestCaseResult, err error) { - var targetTestSuite testing.TestSuite - ExecutionCountNum.Inc() - defer func() { - if result.Error == "" { - ExecutionSuccessNum.Inc() - } else { - ExecutionFailNum.Inc() - } - }() + var targetTestSuite testing.TestSuite + ExecutionCountNum.Inc() + defer func() { + if result.Error == "" { + ExecutionSuccessNum.Inc() + } else { + ExecutionFailNum.Inc() + } + }() - result = &TestCaseResult{} - loader := s.getLoader(ctx) - defer loader.Close() - targetTestSuite, err = loader.GetTestSuite(in.Suite, true) - if err != nil || targetTestSuite.Name == "" { - err = nil - result.Error = fmt.Sprintf("not found suite: %s", in.Suite) - return - } + result = &TestCaseResult{} + loader := s.getLoader(ctx) + defer loader.Close() + targetTestSuite, err = loader.GetTestSuite(in.Suite, true) + if err != nil || targetTestSuite.Name == "" { + err = nil + result.Error = fmt.Sprintf("not found suite: %s", in.Suite) + return + } - var data []byte - if data, err = yaml.Marshal(targetTestSuite); err == nil { - task := &TestTask{ - Kind: "testcaseInSuite", - Data: string(data), - CaseName: in.Testcase, - Level: "debug", - Parameters: in.Parameters, - } + var data []byte + if data, err = yaml.Marshal(targetTestSuite); err == nil { + task := &TestTask{ + Kind: "testcaseInSuite", + Data: string(data), + CaseName: in.Testcase, + Level: "debug", + Parameters: in.Parameters, + } - var reply *TestResult - var lastItem *TestCaseResult - if reply, err = s.Run(ctx, task); err == nil && len(reply.TestCaseResult) > 0 { - lastIndex := len(reply.TestCaseResult) - 1 - lastItem = reply.TestCaseResult[lastIndex] + var reply *TestResult + var lastItem *TestCaseResult + if reply, err = s.Run(ctx, task); err == nil && len(reply.TestCaseResult) > 0 { + lastIndex := len(reply.TestCaseResult) - 1 + lastItem = reply.TestCaseResult[lastIndex] - if len(lastItem.Body) > GrpcMaxRecvMsgSize { - e := "the HTTP response body exceeded the maximum message size limit received by the gRPC client" - result = &TestCaseResult{ - Output: reply.Message, - Error: e, - Body: "", - Header: lastItem.Header, - StatusCode: http.StatusOK, - } - return - } + if len(lastItem.Body) > GrpcMaxRecvMsgSize { + e := "the HTTP response body exceeded the maximum message size limit received by the gRPC client" + result = &TestCaseResult{ + Output: reply.Message, + Error: e, + Body: "", + Header: lastItem.Header, + StatusCode: http.StatusOK, + } + return + } - result = &TestCaseResult{ - Output: reply.Message, - Error: reply.Error, - Body: lastItem.Body, - Header: lastItem.Header, - StatusCode: lastItem.StatusCode, - } - } else if err != nil { - result.Error = err.Error() - } else { - result = &TestCaseResult{ - Output: reply.Message, - Error: reply.Error, - } - } + result = &TestCaseResult{ + Output: reply.Message, + Error: reply.Error, + Body: lastItem.Body, + Header: lastItem.Header, + StatusCode: lastItem.StatusCode, + } + } else if err != nil { + result.Error = err.Error() + } else { + result = &TestCaseResult{ + Output: reply.Message, + Error: reply.Error, + } + } - if reply != nil { - result.Output = reply.Message - result.Error = reply.Error - } - if lastItem != nil { - result.Body = lastItem.Body - result.Header = lastItem.Header - result.StatusCode = lastItem.StatusCode - } - } - return + if reply != nil { + result.Output = reply.Message + result.Error = reply.Error + } + if lastItem != nil { + result.Body = lastItem.Body + result.Header = lastItem.Header + result.StatusCode = lastItem.StatusCode + } + } + return } func mapInterToPair(data map[string]interface{}) (pairs []*Pair) { - pairs = make([]*Pair, 0) - for k, v := range data { - pairs = append(pairs, &Pair{ - Key: k, - Value: fmt.Sprintf("%v", v), - }) - } - return + pairs = make([]*Pair, 0) + for k, v := range data { + pairs = append(pairs, &Pair{ + Key: k, + Value: fmt.Sprintf("%v", v), + }) + } + return } func mapToPair(data map[string]string) (pairs []*Pair) { - pairs = make([]*Pair, 0) - for k, v := range data { - pairs = append(pairs, &Pair{ - Key: k, - Value: v, - }) - } - return + pairs = make([]*Pair, 0) + for k, v := range data { + pairs = append(pairs, &Pair{ + Key: k, + Value: v, + }) + } + return } func pairToInterMap(pairs []*Pair) (data map[string]interface{}) { - data = make(map[string]interface{}) - for _, pair := range pairs { - if pair.Key == "" { - continue - } - data[pair.Key] = pair.Value - } - return + data = make(map[string]interface{}) + for _, pair := range pairs { + if pair.Key == "" { + continue + } + data[pair.Key] = pair.Value + } + return } func pairToMap(pairs []*Pair) (data map[string]string) { - data = make(map[string]string) - for _, pair := range pairs { - if pair.Key == "" { - continue - } - data[pair.Key] = pair.Value - } - return + data = make(map[string]string) + for _, pair := range pairs { + if pair.Key == "" { + continue + } + data[pair.Key] = pair.Value + } + return } func convertConditionalVerify(verify []*ConditionalVerify) (result []testing.ConditionalVerify) { - if verify != nil { - result = make([]testing.ConditionalVerify, 0) + if verify != nil { + result = make([]testing.ConditionalVerify, 0) - for _, item := range verify { - result = append(result, testing.ConditionalVerify{ - Condition: item.Condition, - Verify: item.Verify, - }) - } - } - return + for _, item := range verify { + result = append(result, testing.ConditionalVerify{ + Condition: item.Condition, + Verify: item.Verify, + }) + } + } + return } func (s *server) CreateTestCase(ctx context.Context, in *TestCaseWithSuite) (reply *HelloReply, err error) { - reply = &HelloReply{} - if in.Data == nil { - err = errors.New("data is required") - } else { - loader := s.getLoader(ctx) - defer loader.Close() - err = loader.CreateTestCase(in.SuiteName, ToNormalTestCase(in.Data)) - } - return + reply = &HelloReply{} + if in.Data == nil { + err = errors.New("data is required") + } else { + loader := s.getLoader(ctx) + defer loader.Close() + err = loader.CreateTestCase(in.SuiteName, ToNormalTestCase(in.Data)) + } + return } func (s *server) UpdateTestCase(ctx context.Context, in *TestCaseWithSuite) (reply *HelloReply, err error) { - reply = &HelloReply{} - if in.Data == nil { - err = errors.New("data is required") - return - } - loader := s.getLoader(ctx) - defer loader.Close() - err = loader.UpdateTestCase(in.SuiteName, ToNormalTestCase(in.Data)) - return + reply = &HelloReply{} + if in.Data == nil { + err = errors.New("data is required") + return + } + loader := s.getLoader(ctx) + defer loader.Close() + err = loader.UpdateTestCase(in.SuiteName, ToNormalTestCase(in.Data)) + return } func (s *server) DeleteTestCase(ctx context.Context, in *TestCaseIdentity) (reply *HelloReply, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &HelloReply{} - err = loader.DeleteTestCase(in.Suite, in.Testcase) - return + loader := s.getLoader(ctx) + defer loader.Close() + reply = &HelloReply{} + err = loader.DeleteTestCase(in.Suite, in.Testcase) + return } func (s *server) DeleteHistoryTestCase(ctx context.Context, in *HistoryTestCase) (reply *HelloReply, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &HelloReply{} - err = loader.DeleteHistoryTestCase(in.ID) - return + loader := s.getLoader(ctx) + defer loader.Close() + reply = &HelloReply{} + err = loader.DeleteHistoryTestCase(in.ID) + return } func (s *server) DeleteAllHistoryTestCase(ctx context.Context, in *HistoryTestCase) (reply *HelloReply, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &HelloReply{} - err = loader.DeleteAllHistoryTestCase(in.SuiteName, in.CaseName) - return + loader := s.getLoader(ctx) + defer loader.Close() + reply = &HelloReply{} + err = loader.DeleteAllHistoryTestCase(in.SuiteName, in.CaseName) + return } func (s *server) DuplicateTestCase(ctx context.Context, in *TestCaseDuplicate) (reply *HelloReply, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() + reply = &HelloReply{} - if in.SourceCaseName == in.TargetCaseName { - reply.Error = "source and target case name should be different" - return - } + if in.SourceCaseName == in.TargetCaseName { + reply.Error = "source and target case name should be different" + return + } - var testcase testing.TestCase - if testcase, err = loader.GetTestCase(in.SourceSuiteName, in.SourceCaseName); err == nil { - testcase.Name = in.TargetCaseName - err = loader.CreateTestCase(in.TargetSuiteName, testcase) - } - return + var testcase testing.TestCase + if testcase, err = loader.GetTestCase(in.SourceSuiteName, in.SourceCaseName); err == nil { + testcase.Name = in.TargetCaseName + err = loader.CreateTestCase(in.TargetSuiteName, testcase) + } + return } func (s *server) RenameTestCase(ctx context.Context, in *TestCaseDuplicate) (result *HelloReply, err error) { - result = &HelloReply{} - loader := s.getLoader(ctx) - defer loader.Close() - err = loader.RenameTestCase(in.SourceSuiteName, in.SourceCaseName, in.TargetCaseName) - return + result = &HelloReply{} + loader := s.getLoader(ctx) + defer loader.Close() + err = loader.RenameTestCase(in.SourceSuiteName, in.SourceCaseName, in.TargetCaseName) + return } // code generator func (s *server) ListCodeGenerator(ctx context.Context, in *Empty) (reply *SimpleList, err error) { - reply = &SimpleList{} + reply = &SimpleList{} - generators := generator.GetCodeGenerators() - for name := range generators { - reply.Data = append(reply.Data, &Pair{ - Key: name, - }) - } - return + generators := generator.GetCodeGenerators() + for name := range generators { + reply.Data = append(reply.Data, &Pair{ + Key: name, + }) + } + return } func (s *server) GenerateCode(ctx context.Context, in *CodeGenerateRequest) (reply *CommonResult, err error) { - reply = &CommonResult{} - instance := generator.GetCodeGenerator(in.Generator) - if instance == nil { - reply.Success = false - reply.Message = fmt.Sprintf("generator '%s' not found", in.Generator) - } else { - var result testing.TestCase - var suite testing.TestSuite + reply = &CommonResult{} + instance := generator.GetCodeGenerator(in.Generator) + if instance == nil { + reply.Success = false + reply.Message = fmt.Sprintf("generator '%s' not found", in.Generator) + } else { + var result testing.TestCase + var suite testing.TestSuite - loader := s.getLoader(ctx) - if suite, err = loader.GetTestSuite(in.TestSuite, true); err != nil { - return - } + loader := s.getLoader(ctx) + if suite, err = loader.GetTestSuite(in.TestSuite, true); err != nil { + return + } - dataContext := map[string]interface{}{} - if err = suite.Render(dataContext); err != nil { - return - } + dataContext := map[string]interface{}{} + if err = suite.Render(dataContext); err != nil { + return + } - var output string - var genErr error - if in.TestCase == "" { - output, genErr = instance.Generate(&suite, nil) - } else { - if result, err = loader.GetTestCase(in.TestSuite, in.TestCase); err == nil { - result.Request.RenderAPI(suite.API) + var output string + var genErr error + if in.TestCase == "" { + output, genErr = instance.Generate(&suite, nil) + } else { + if result, err = loader.GetTestCase(in.TestSuite, in.TestCase); err == nil { + result.Request.RenderAPI(suite.API) - output, genErr = instance.Generate(&suite, &result) - } - } - reply.Success = genErr == nil - reply.Message = util.OrErrorMessage(genErr, output) - } - return + output, genErr = instance.Generate(&suite, &result) + } + } + reply.Success = genErr == nil + reply.Message = util.OrErrorMessage(genErr, output) + } + return } func (s *server) HistoryGenerateCode(ctx context.Context, in *CodeGenerateRequest) (reply *CommonResult, err error) { - reply = &CommonResult{} - instance := generator.GetCodeGenerator(in.Generator) - if instance == nil { - reply.Success = false - reply.Message = fmt.Sprintf("generator '%s' not found", in.Generator) - } else { - loader := s.getLoader(ctx) - var result testing.HistoryTestCase - result, err = loader.GetHistoryTestCase(in.ID) - var testCase testing.TestCase - var suite testing.TestSuite - testCase = result.Data - suite.Name = result.SuiteName - suite.API = result.SuiteAPI - suite.Spec = result.SuiteSpec - suite.Param = result.SuiteParam + reply = &CommonResult{} + instance := generator.GetCodeGenerator(in.Generator) + if instance == nil { + reply.Success = false + reply.Message = fmt.Sprintf("generator '%s' not found", in.Generator) + } else { + loader := s.getLoader(ctx) + var result testing.HistoryTestCase + result, err = loader.GetHistoryTestCase(in.ID) + var testCase testing.TestCase + var suite testing.TestSuite + testCase = result.Data + suite.Name = result.SuiteName + suite.API = result.SuiteAPI + suite.Spec = result.SuiteSpec + suite.Param = result.SuiteParam - output, genErr := instance.Generate(&suite, &testCase) - reply.Success = genErr == nil - reply.Message = util.OrErrorMessage(genErr, output) - } - return + output, genErr := instance.Generate(&suite, &testCase) + reply.Success = genErr == nil + reply.Message = util.OrErrorMessage(genErr, output) + } + return } // converter func (s *server) ListConverter(ctx context.Context, in *Empty) (reply *SimpleList, err error) { - reply = &SimpleList{} - converters := generator.GetTestSuiteConverters() - for name := range converters { - reply.Data = append(reply.Data, &Pair{ - Key: name, - }) - } - return + reply = &SimpleList{} + converters := generator.GetTestSuiteConverters() + for name := range converters { + reply.Data = append(reply.Data, &Pair{ + Key: name, + }) + } + return } func (s *server) ConvertTestSuite(ctx context.Context, in *CodeGenerateRequest) (reply *CommonResult, err error) { - reply = &CommonResult{} + reply = &CommonResult{} - instance := generator.GetTestSuiteConverter(in.Generator) - if instance == nil { - reply.Success = false - reply.Message = fmt.Sprintf("converter '%s' not found", in.Generator) - } else { - var result testing.TestSuite - loader := s.getLoader(ctx) - defer loader.Close() - if result, err = loader.GetTestSuite(in.TestSuite, true); err == nil { - output, genErr := instance.Convert(&result) - reply.Success = genErr == nil - reply.Message = util.OrErrorMessage(genErr, output) - } - } - return + instance := generator.GetTestSuiteConverter(in.Generator) + if instance == nil { + reply.Success = false + reply.Message = fmt.Sprintf("converter '%s' not found", in.Generator) + } else { + var result testing.TestSuite + loader := s.getLoader(ctx) + defer loader.Close() + if result, err = loader.GetTestSuite(in.TestSuite, true); err == nil { + output, genErr := instance.Convert(&result) + reply.Success = genErr == nil + reply.Message = util.OrErrorMessage(genErr, output) + } + } + return } // Sample returns a sample of the test task func (s *server) Sample(ctx context.Context, in *Empty) (reply *HelloReply, err error) { - reply = &HelloReply{Message: sample.TestSuiteGitLab} - return + reply = &HelloReply{Message: sample.TestSuiteGitLab} + return } // PopularHeaders returns a list of popular headers func (s *server) PopularHeaders(ctx context.Context, in *Empty) (pairs *Pairs, err error) { - pairs = &Pairs{ - Data: []*Pair{}, - } + pairs = &Pairs{ + Data: []*Pair{}, + } - err = yaml.Unmarshal(popularHeaders, &pairs.Data) - return + err = yaml.Unmarshal(popularHeaders, &pairs.Data) + return } // GetSuggestedAPIs returns a list of suggested APIs func (s *server) GetSuggestedAPIs(ctx context.Context, in *TestSuiteIdentity) (reply *TestCases, err error) { - reply = &TestCases{} + reply = &TestCases{} - var suite *testing.TestSuite - loader := s.getLoader(ctx) - defer loader.Close() - if suite, _, err = loader.GetSuite(in.Name); err != nil || suite == nil { - return - } + var suite *testing.TestSuite + loader := s.getLoader(ctx) + defer loader.Close() + if suite, _, err = loader.GetSuite(in.Name); err != nil || suite == nil { + return + } - remoteServerLogger.Info("Finding APIs from", "name", in.Name, "with loader", reflect.TypeOf(loader)) + remoteServerLogger.Info("Finding APIs from", "name", in.Name, "with loader", reflect.TypeOf(loader)) - suiteRunner := runner.GetTestSuiteRunner(suite) - var result []*testing.TestCase - if result, err = suiteRunner.GetSuggestedAPIs(suite, in.Api); err == nil && result != nil { - for i := range result { - reply.Data = append(reply.Data, ToGRPCTestCase(*result[i])) - } - } - return + suiteRunner := runner.GetTestSuiteRunner(suite) + var result []*testing.TestCase + if result, err = suiteRunner.GetSuggestedAPIs(suite, in.Api); err == nil && result != nil { + for i := range result { + reply.Data = append(reply.Data, ToGRPCTestCase(*result[i])) + } + } + return } // FunctionsQuery returns a list of functions func (s *server) FunctionsQuery(ctx context.Context, in *SimpleQuery) (reply *Pairs, err error) { - reply = &Pairs{} - in.Name = strings.ToLower(in.Name) + reply = &Pairs{} + in.Name = strings.ToLower(in.Name) - if in.Kind == "verify" { - for _, fn := range builtin.Builtins { - lowerName := strings.ToLower(fn.Name) - if in.Name == "" || strings.Contains(lowerName, in.Name) { - reply.Data = append(reply.Data, &Pair{ - Key: fn.Name, - Value: fmt.Sprintf("%v", reflect.TypeOf(fn.Func)), - }) - } - } - } else { - for name, fn := range render.FuncMap() { - lowerName := strings.ToLower(name) - if in.Name == "" || strings.Contains(lowerName, in.Name) { - reply.Data = append(reply.Data, &Pair{ - Key: name, - Value: fmt.Sprintf("%v", reflect.TypeOf(fn)), - Description: render.FuncUsage(name), - }) - } - } - } - return + if in.Kind == "verify" { + for _, fn := range builtin.Builtins { + lowerName := strings.ToLower(fn.Name) + if in.Name == "" || strings.Contains(lowerName, in.Name) { + reply.Data = append(reply.Data, &Pair{ + Key: fn.Name, + Value: fmt.Sprintf("%v", reflect.TypeOf(fn.Func)), + }) + } + } + } else { + for name, fn := range render.FuncMap() { + lowerName := strings.ToLower(name) + if in.Name == "" || strings.Contains(lowerName, in.Name) { + reply.Data = append(reply.Data, &Pair{ + Key: name, + Value: fmt.Sprintf("%v", reflect.TypeOf(fn)), + Description: render.FuncUsage(name), + }) + } + } + } + return } // FunctionsQueryStream works like FunctionsQuery but is implemented in bidirectional streaming func (s *server) FunctionsQueryStream(srv Runner_FunctionsQueryStreamServer) error { - ctx := srv.Context() - for { - select { - case <-ctx.Done(): - return ctx.Err() - default: - in, err := srv.Recv() - if err != nil { - if err == io.EOF { - return nil - } - return err - } - reply := &Pairs{} - in.Name = strings.ToLower(in.Name) + ctx := srv.Context() + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + in, err := srv.Recv() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + reply := &Pairs{} + in.Name = strings.ToLower(in.Name) - for name, fn := range render.FuncMap() { - lowerCaseName := strings.ToLower(name) - if in.Name == "" || strings.Contains(lowerCaseName, in.Name) { - reply.Data = append(reply.Data, &Pair{ - Key: name, - Value: fmt.Sprintf("%v", reflect.TypeOf(fn)), - }) - } - } - if err := srv.Send(reply); err != nil { - return err - } - } - } + for name, fn := range render.FuncMap() { + lowerCaseName := strings.ToLower(name) + if in.Name == "" || strings.Contains(lowerCaseName, in.Name) { + reply.Data = append(reply.Data, &Pair{ + Key: name, + Value: fmt.Sprintf("%v", reflect.TypeOf(fn)), + }) + } + } + if err := srv.Send(reply); err != nil { + return err + } + } + } } func (s *server) GetStoreKinds(context.Context, *Empty) (kinds *StoreKinds, err error) { - storeFactory := testing.NewStoreFactory(s.configDir) - var stores []testing.StoreKind - if stores, err = storeFactory.GetStoreKinds(); err == nil { - kinds = &StoreKinds{} - for _, store := range stores { - kinds.Data = append(kinds.Data, &StoreKind{ - Name: store.Name, - Enabled: store.Enabled, - Url: store.URL, - }) - } - } - return + storeFactory := testing.NewStoreFactory(s.configDir) + var stores []testing.StoreKind + if stores, err = storeFactory.GetStoreKinds(); err == nil { + kinds = &StoreKinds{} + for _, store := range stores { + kinds.Data = append(kinds.Data, &StoreKind{ + Name: store.Name, + Enabled: store.Enabled, + Url: store.URL, + }) + } + } + return } func (s *server) GetStores(ctx context.Context, in *Empty) (reply *Stores, err error) { - user := oauth.GetUserFromContext(ctx) - storeFactory := testing.NewStoreFactory(s.configDir) - var stores []testing.Store - var owner string - if user != nil { - owner = user.Name - } - if stores, err = storeFactory.GetStoresByOwner(owner); err == nil { - reply = &Stores{ - Data: make([]*Store, 0), - } - for _, item := range stores { - grpcStore := ToGRPCStore(item) + user := oauth.GetUserFromContext(ctx) + storeFactory := testing.NewStoreFactory(s.configDir) + var stores []testing.Store + var owner string + if user != nil { + owner = user.Name + } + if stores, err = storeFactory.GetStoresByOwner(owner); err == nil { + reply = &Stores{ + Data: make([]*Store, 0), + } + for _, item := range stores { + grpcStore := ToGRPCStore(item) - storeStatus, sErr := s.VerifyStore(ctx, &SimpleQuery{Name: item.Name}) - grpcStore.Ready = sErr == nil && storeStatus.Ready - grpcStore.ReadOnly = storeStatus.ReadOnly - grpcStore.Password = "******" // return a placeholder instead of the actual value for the security reason + storeStatus, sErr := s.VerifyStore(ctx, &SimpleQuery{Name: item.Name}) + grpcStore.Ready = sErr == nil && storeStatus.Ready + grpcStore.ReadOnly = storeStatus.ReadOnly + grpcStore.Password = "******" // return a placeholder instead of the actual value for the security reason - reply.Data = append(reply.Data, grpcStore) - } - reply.Data = append(reply.Data, &Store{ - Name: "local", - Kind: &StoreKind{}, - Ready: true, - }) - } - return + reply.Data = append(reply.Data, grpcStore) + } + reply.Data = append(reply.Data, &Store{ + Name: "local", + Kind: &StoreKind{}, + Ready: true, + }) + } + return } func (s *server) CreateStore(ctx context.Context, in *Store) (reply *Store, err error) { - reply = &Store{} - user := oauth.GetUserFromContext(ctx) - if user != nil { - in.Owner = user.Name - } + reply = &Store{} + user := oauth.GetUserFromContext(ctx) + if user != nil { + in.Owner = user.Name + } - storeFactory := testing.NewStoreFactory(s.configDir) - store := ToNormalStore(in) + storeFactory := testing.NewStoreFactory(s.configDir) + store := ToNormalStore(in) - if store.Kind.URL == "" { - store.Kind.URL = fmt.Sprintf("unix://%s", home.GetExtensionSocketPath(store.Kind.Name)) - } + if store.Kind.URL == "" { + store.Kind.URL = fmt.Sprintf("unix://%s", home.GetExtensionSocketPath(store.Kind.Name)) + } - if err = storeFactory.CreateStore(store); err == nil && s.storeExtMgr != nil { - err = s.storeExtMgr.Start(store.Kind.Name, store.Kind.URL) - } - return + if err = storeFactory.CreateStore(store); err == nil && s.storeExtMgr != nil { + err = s.storeExtMgr.Start(store.Kind.Name, store.Kind.URL) + } + return } func (s *server) UpdateStore(ctx context.Context, in *Store) (reply *Store, err error) { - reply = &Store{} - storeFactory := testing.NewStoreFactory(s.configDir) - store := ToNormalStore(in) - if err = storeFactory.UpdateStore(store); err == nil && s.storeExtMgr != nil { - // TODO need to restart extension if config was changed - err = s.storeExtMgr.Start(store.Kind.Name, store.Kind.URL) - } - return + reply = &Store{} + storeFactory := testing.NewStoreFactory(s.configDir) + store := ToNormalStore(in) + if err = storeFactory.UpdateStore(store); err == nil && s.storeExtMgr != nil { + // TODO need to restart extension if config was changed + err = s.storeExtMgr.Start(store.Kind.Name, store.Kind.URL) + } + return } func (s *server) DeleteStore(ctx context.Context, in *Store) (reply *Store, err error) { - reply = &Store{} - storeFactory := testing.NewStoreFactory(s.configDir) - err = storeFactory.DeleteStore(in.Name) - return + reply = &Store{} + storeFactory := testing.NewStoreFactory(s.configDir) + err = storeFactory.DeleteStore(in.Name) + return } func (s *server) VerifyStore(ctx context.Context, in *SimpleQuery) (reply *ExtensionStatus, err error) { - reply = &ExtensionStatus{} - var loader testing.Writer - if loader, err = s.getLoaderByStoreName(in.Name); err == nil && loader != nil { - readOnly, verifyErr := loader.Verify() - reply.Ready = verifyErr == nil - reply.ReadOnly = readOnly - reply.Message = util.OKOrErrorMessage(verifyErr) - } - return + reply = &ExtensionStatus{} + var loader testing.Writer + if loader, err = s.getLoaderByStoreName(in.Name); err == nil && loader != nil { + readOnly, verifyErr := loader.Verify() + reply.Ready = verifyErr == nil + reply.ReadOnly = readOnly + reply.Message = util.OKOrErrorMessage(verifyErr) + } + return } // secret related interfaces func (s *server) GetSecrets(ctx context.Context, in *Empty) (reply *Secrets, err error) { - return s.secretServer.GetSecrets(ctx, in) + return s.secretServer.GetSecrets(ctx, in) } func (s *server) CreateSecret(ctx context.Context, in *Secret) (reply *CommonResult, err error) { - return s.secretServer.CreateSecret(ctx, in) + return s.secretServer.CreateSecret(ctx, in) } func (s *server) DeleteSecret(ctx context.Context, in *Secret) (reply *CommonResult, err error) { - return s.secretServer.DeleteSecret(ctx, in) + return s.secretServer.DeleteSecret(ctx, in) } func (s *server) UpdateSecret(ctx context.Context, in *Secret) (reply *CommonResult, err error) { - return s.secretServer.UpdateSecret(ctx, in) + return s.secretServer.UpdateSecret(ctx, in) } func (s *server) PProf(ctx context.Context, in *PProfRequest) (reply *PProfData, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - reply = &PProfData{ - Data: loader.PProf(in.Name), - } - return + loader := s.getLoader(ctx) + defer loader.Close() + reply = &PProfData{ + Data: loader.PProf(in.Name), + } + return } func (s *server) Query(ctx context.Context, query *DataQuery) (result *DataQueryResult, err error) { - loader := s.getLoader(ctx) - defer loader.Close() - var dataResult map[string]string - var items []map[string]string - if dataResult, items, err = loader.Query(map[string]string{ - "sql": query.Sql, - "key": query.Key, - }); err == nil { - result = &DataQueryResult{ - Data: mapToPair(dataResult), - } - for _, item := range items { - result.Items = append(result.Items, &Pairs{ - Data: mapToPair(item), - }) - } - } - return + loader := s.getLoader(ctx) + defer loader.Close() + var dataResult testing.DataResult + if dataResult, err = loader.Query(map[string]string{ + "sql": query.Sql, + "key": query.Key, + }); err == nil { + result = &DataQueryResult{ + Data: mapToPair(dataResult.Pairs), + } + for _, item := range dataResult.Rows { + result.Items = append(result.Items, &Pairs{ + Data: mapToPair(item), + }) + } + result.Meta = &DataMeta{ + CurrentDatabase: dataResult.CurrentDatabase, + Databases: dataResult.Databases, + Tables: dataResult.Tables, + } + } + return } // implement the mock server // Start starts the mock server type mockServerController struct { - UnimplementedMockServer - mockWriter mock.ReaderAndWriter - loader mock.Loadable - reader mock.Reader - prefix string - combinePort int + UnimplementedMockServer + mockWriter mock.ReaderAndWriter + loader mock.Loadable + reader mock.Reader + prefix string + combinePort int } func NewMockServerController(mockWriter mock.ReaderAndWriter, loader mock.Loadable, combinePort int) MockServer { - return &mockServerController{ - mockWriter: mockWriter, - loader: loader, - prefix: "/mock/server", - combinePort: combinePort, - } + return &mockServerController{ + mockWriter: mockWriter, + loader: loader, + prefix: "/mock/server", + combinePort: combinePort, + } } func (s *mockServerController) Reload(ctx context.Context, in *MockConfig) (reply *Empty, err error) { - s.mockWriter.Write([]byte(in.Config)) - s.prefix = in.Prefix - if dServer, ok := s.loader.(mock.DynamicServer); ok && dServer.GetPort() != strconv.Itoa(int(in.GetPort())) { - if strconv.Itoa(s.combinePort) != dServer.GetPort() { - if stopErr := dServer.Stop(); stopErr != nil { - remoteServerLogger.Info("failed to stop old server", "error", stopErr) - } else { - remoteServerLogger.Info("old server stopped", "port", dServer.GetPort()) - } - } + s.mockWriter.Write([]byte(in.Config)) + s.prefix = in.Prefix + if dServer, ok := s.loader.(mock.DynamicServer); ok && dServer.GetPort() != strconv.Itoa(int(in.GetPort())) { + if strconv.Itoa(s.combinePort) != dServer.GetPort() { + if stopErr := dServer.Stop(); stopErr != nil { + remoteServerLogger.Info("failed to stop old server", "error", stopErr) + } else { + remoteServerLogger.Info("old server stopped", "port", dServer.GetPort()) + } + } - server := mock.NewInMemoryServer(ctx, int(in.GetPort())) - server.Start(s.mockWriter, in.Prefix) - s.loader = server - } - err = s.loader.Load() - return + server := mock.NewInMemoryServer(ctx, int(in.GetPort())) + server.Start(s.mockWriter, in.Prefix) + s.loader = server + } + err = s.loader.Load() + return } func (s *mockServerController) GetConfig(ctx context.Context, in *Empty) (reply *MockConfig, err error) { - reply = &MockConfig{ - Prefix: s.prefix, - Config: string(s.mockWriter.GetData()), - } - if dServer, ok := s.loader.(mock.DynamicServer); ok { - if port, pErr := strconv.ParseInt(dServer.GetPort(), 10, 32); pErr == nil { - reply.Port = int32(port) - } - } - return + reply = &MockConfig{ + Prefix: s.prefix, + Config: string(s.mockWriter.GetData()), + } + if dServer, ok := s.loader.(mock.DynamicServer); ok { + if port, pErr := strconv.ParseInt(dServer.GetPort(), 10, 32); pErr == nil { + reply.Port = int32(port) + } + } + return } func (s *server) getLoaderByStoreName(storeName string) (loader testing.Writer, err error) { - var store *testing.Store - store, err = testing.NewStoreFactory(s.configDir).GetStore(storeName) - if err == nil && store != nil { - loader, err = s.storeWriterFactory.NewInstance(*store) - if err != nil { - err = fmt.Errorf("failed to new grpc loader from store %s, err: %v", store.Name, err) - } - } else { - err = fmt.Errorf("failed to get store %s, err: %v", storeName, err) - } - return + var store *testing.Store + store, err = testing.NewStoreFactory(s.configDir).GetStore(storeName) + if err == nil && store != nil { + loader, err = s.storeWriterFactory.NewInstance(*store) + if err != nil { + err = fmt.Errorf("failed to new grpc loader from store %s, err: %v", store.Name, err) + } + } else { + err = fmt.Errorf("failed to get store %s, err: %v", storeName, err) + } + return } //go:embed data/headers.yaml var popularHeaders []byte func findParentTestCases(testcase *testing.TestCase, suite *testing.TestSuite) (testcases []testing.TestCase) { - reg, matchErr := regexp.Compile(`(.*?\{\{.*\.\w*.*?\}\})`) - targetReg, targetErr := regexp.Compile(`\.\w*`) + reg, matchErr := regexp.Compile(`(.*?\{\{.*\.\w*.*?\}\})`) + targetReg, targetErr := regexp.Compile(`\.\w*`) - expectNames := new(UniqueSlice[string]) - if matchErr == nil && targetErr == nil { - var expectName string - for _, val := range testcase.Request.Header { - if matched := reg.MatchString(val); matched { - expectName = targetReg.FindString(val) - expectName = strings.TrimPrefix(expectName, ".") - expectNames.Push(expectName) - } - } + expectNames := new(UniqueSlice[string]) + if matchErr == nil && targetErr == nil { + var expectName string + for _, val := range testcase.Request.Header { + if matched := reg.MatchString(val); matched { + expectName = targetReg.FindString(val) + expectName = strings.TrimPrefix(expectName, ".") + expectNames.Push(expectName) + } + } - findExpectNames(testcase.Request.API, expectNames) - findExpectNames(testcase.Request.Body.String(), expectNames) + findExpectNames(testcase.Request.API, expectNames) + findExpectNames(testcase.Request.Body.String(), expectNames) - remoteServerLogger.Info("expect test case names", "name", expectNames.GetAll()) - for _, item := range suite.Items { - if expectNames.Exist(item.Name) { - testcases = append(testcases, item) - } - } - } - return + remoteServerLogger.Info("expect test case names", "name", expectNames.GetAll()) + for _, item := range suite.Items { + if expectNames.Exist(item.Name) { + testcases = append(testcases, item) + } + } + } + return } func findExpectNames(target string, expectNames *UniqueSlice[string]) { - reg, _ := regexp.Compile(`(.*?\{\{.*\.\w*.*?\}\})`) - targetReg, _ := regexp.Compile(`\.\w*`) + reg, _ := regexp.Compile(`(.*?\{\{.*\.\w*.*?\}\})`) + targetReg, _ := regexp.Compile(`\.\w*`) - for _, sub := range reg.FindStringSubmatch(target) { - // remove {{ and }} - if left, leftErr := regexp.Compile(`.*\{\{`); leftErr == nil { - body := left.ReplaceAllString(sub, "") + for _, sub := range reg.FindStringSubmatch(target) { + // remove {{ and }} + if left, leftErr := regexp.Compile(`.*\{\{`); leftErr == nil { + body := left.ReplaceAllString(sub, "") - expectName := targetReg.FindString(body) - expectName = strings.TrimPrefix(expectName, ".") - expectNames.Push(expectName) - } - } + expectName := targetReg.FindString(body) + expectName = strings.TrimPrefix(expectName, ".") + expectNames.Push(expectName) + } + } } // UniqueSlice represents an unique slice type UniqueSlice[T comparable] struct { - data []T + data []T } // Push pushes an item if it's not exist func (s *UniqueSlice[T]) Push(item T) *UniqueSlice[T] { - if s.data == nil { - s.data = []T{item} - } else { - for _, it := range s.data { - if it == item { - return s - } - } - s.data = append(s.data, item) - } - return s + if s.data == nil { + s.data = []T{item} + } else { + for _, it := range s.data { + if it == item { + return s + } + } + s.data = append(s.data, item) + } + return s } // Exist checks if the item exist, return true it exists func (s *UniqueSlice[T]) Exist(item T) bool { - if s.data != nil { - for _, it := range s.data { - if it == item { - return true - } - } - } - return false + if s.data != nil { + for _, it := range s.data { + if it == item { + return true + } + } + } + return false } // GetAll returns all the items func (s *UniqueSlice[T]) GetAll() []T { - return s.data + return s.data } var errNoTestSuiteFound = errors.New("no test suite found") diff --git a/pkg/server/server.pb.go b/pkg/server/server.pb.go index 44d24f6..8737b9d 100644 --- a/pkg/server/server.pb.go +++ b/pkg/server/server.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v4.25.1 +// protoc v4.22.2 // source: pkg/server/server.proto package server @@ -3437,8 +3437,9 @@ type DataQueryResult struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Data []*Pair `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` - Items []*Pairs `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"` + Data []*Pair `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` + Items []*Pairs `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"` + Meta *DataMeta `protobuf:"bytes,3,opt,name=meta,proto3" json:"meta,omitempty"` } func (x *DataQueryResult) Reset() { @@ -3487,6 +3488,76 @@ func (x *DataQueryResult) GetItems() []*Pairs { return nil } +func (x *DataQueryResult) GetMeta() *DataMeta { + if x != nil { + return x.Meta + } + return nil +} + +type DataMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Databases []string `protobuf:"bytes,1,rep,name=databases,proto3" json:"databases,omitempty"` + Tables []string `protobuf:"bytes,2,rep,name=tables,proto3" json:"tables,omitempty"` + CurrentDatabase string `protobuf:"bytes,3,opt,name=currentDatabase,proto3" json:"currentDatabase,omitempty"` +} + +func (x *DataMeta) Reset() { + *x = DataMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_pkg_server_server_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMeta) ProtoMessage() {} + +func (x *DataMeta) ProtoReflect() protoreflect.Message { + mi := &file_pkg_server_server_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMeta.ProtoReflect.Descriptor instead. +func (*DataMeta) Descriptor() ([]byte, []int) { + return file_pkg_server_server_proto_rawDescGZIP(), []int{54} +} + +func (x *DataMeta) GetDatabases() []string { + if x != nil { + return x.Databases + } + return nil +} + +func (x *DataMeta) GetTables() []string { + if x != nil { + return x.Tables + } + return nil +} + +func (x *DataMeta) GetCurrentDatabase() string { + if x != nil { + return x.CurrentDatabase + } + return "" +} + var File_pkg_server_server_proto protoreflect.FileDescriptor var file_pkg_server_server_proto_rawDesc = []byte{ @@ -3872,337 +3943,346 @@ var file_pkg_server_server_proto_rawDesc = []byte{ 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, - 0x71, 0x6c, 0x22, 0x58, 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x71, 0x6c, 0x22, 0x7e, 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x50, 0x61, 0x69, 0x72, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x32, 0xa1, 0x25, 0x0a, - 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x10, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x0c, - 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6e, - 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x28, 0x01, 0x30, 0x01, 0x12, 0x42, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, - 0x73, 0x12, 0x5b, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x62, - 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, - 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, - 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x5a, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, - 0x74, 0x65, 0x12, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, - 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x1a, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x0f, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, + 0x50, 0x61, 0x69, 0x72, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x04, + 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x22, 0x6a, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1c, + 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x32, 0xa1, + 0x25, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x03, 0x52, 0x75, 0x6e, + 0x12, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5f, + 0x0a, 0x0c, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, - 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7b, 0x0a, 0x12, - 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, - 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x22, 0x2a, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x75, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0f, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x44, - 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, - 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x63, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, - 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x75, 0x6e, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x28, 0x01, 0x30, 0x01, 0x12, + 0x42, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0d, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, + 0x74, 0x65, 0x73, 0x12, 0x5b, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, + 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x3a, 0x01, 0x2a, + 0x12, 0x62, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, + 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x14, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, + 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, - 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x59, 0x61, 0x6d, 0x6c, 0x44, 0x61, 0x74, - 0x61, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, + 0x74, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x5a, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, + 0x75, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, + 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, + 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, + 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7b, + 0x0a, 0x12, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, + 0x75, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x22, 0x2a, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, + 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0f, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1a, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, + 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, + 0x74, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x1a, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x59, 0x61, 0x6d, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x79, 0x61, 0x6d, 0x6c, 0x12, 0x5d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, 0x74, + 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x79, 0x61, 0x6d, 0x6c, 0x12, 0x5d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x73, + 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, + 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, + 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, + 0x16, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, + 0x2b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, + 0x7b, 0x73, 0x75, 0x69, 0x74, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x74, + 0x65, 0x73, 0x74, 0x63, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x72, 0x75, 0x6e, 0x3a, 0x01, 0x2a, 0x12, + 0x56, 0x0a, 0x08, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x52, 0x75, 0x6e, + 0x3a, 0x01, 0x2a, 0x28, 0x01, 0x30, 0x01, 0x12, 0x6a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x65, + 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x1a, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, + 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, + 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x73, 0x74, 0x63, 0x61, + 0x73, 0x65, 0x7d, 0x12, 0x6c, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, - 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x22, - 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, - 0x61, 0x73, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, - 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2b, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, - 0x75, 0x69, 0x74, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x73, - 0x74, 0x63, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x72, 0x75, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, - 0x08, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x52, 0x75, 0x6e, 0x3a, 0x01, - 0x2a, 0x28, 0x01, 0x30, 0x01, 0x12, 0x6a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x10, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, 0x65, 0x7d, - 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x73, 0x74, 0x63, 0x61, 0x73, 0x65, - 0x7d, 0x12, 0x6c, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, + 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, + 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, + 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x3a, 0x01, + 0x2a, 0x12, 0x78, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, + 0x6c, 0x79, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x1a, 0x2c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0x78, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, - 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x1a, 0x2c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x29, 0x2a, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, + 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, + 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x73, 0x74, 0x63, 0x61, 0x73, 0x65, 0x7d, 0x12, 0x90, 0x01, 0x0a, + 0x11, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, + 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x73, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x22, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, + 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, + 0x8a, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, + 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x73, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x22, 0x3e, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, + 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x50, 0x49, 0x73, + 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x50, 0x49, 0x73, 0x12, 0x57, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x75, 0x69, 0x74, 0x65, + 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x15, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, + 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, + 0x1a, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2f, 0x7b, 0x49, 0x44, 0x7d, 0x12, 0x6c, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, + 0x65, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x17, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, + 0x61, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x73, 0x65, 0x2f, 0x7b, 0x49, 0x44, 0x7d, 0x12, 0x6a, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, + 0x73, 0x65, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, + 0x2f, 0x7b, 0x49, 0x44, 0x7d, 0x12, 0x83, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x41, 0x6c, 0x6c, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, + 0x73, 0x65, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x2a, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, + 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, + 0x2f, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x74, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x41, 0x6c, 0x6c, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, + 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, - 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x29, 0x2a, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, - 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x7b, 0x74, 0x65, 0x73, 0x74, 0x63, 0x61, 0x73, 0x65, 0x7d, 0x12, 0x90, 0x01, 0x0a, 0x11, 0x44, - 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, - 0x73, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x22, 0x41, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x8a, 0x01, - 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, - 0x73, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x22, 0x3e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x50, 0x49, 0x73, 0x12, 0x19, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x22, 0x1d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x50, 0x49, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, - 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x15, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x75, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x19, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, - 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x28, 0x12, 0x26, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x2f, 0x7b, 0x49, 0x44, 0x7d, 0x12, 0x6c, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, - 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, - 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, - 0x73, 0x65, 0x2f, 0x7b, 0x49, 0x44, 0x7d, 0x12, 0x6a, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x2f, 0x7b, - 0x49, 0x44, 0x7d, 0x12, 0x83, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, - 0x6c, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x3a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x2a, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, - 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, - 0x63, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x74, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x41, 0x6c, 0x6c, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x73, 0x65, 0x1a, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x22, 0x2f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x56, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, - 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, - 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x24, 0x22, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x13, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, - 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x74, 0x65, 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, - 0x12, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x54, - 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x4e, 0x0a, 0x0e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, - 0x72, 0x73, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x5e, 0x0a, 0x14, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x13, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x28, - 0x01, 0x30, 0x01, 0x12, 0x45, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x06, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, - 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, - 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, - 0x6b, 0x0a, 0x14, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x2f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x0d, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, - 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x42, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, - 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x0b, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, - 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x0b, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, 0x15, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x5d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x45, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x0c, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x54, 0x0a, - 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x56, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x0c, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x24, 0x22, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x13, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x73, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x12, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4e, 0x0a, 0x0e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, + 0x61, 0x69, 0x72, 0x73, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5e, 0x0a, 0x14, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x13, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, + 0x73, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x28, 0x01, 0x30, 0x01, 0x12, 0x45, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x06, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, + 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x10, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x2f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x2f, 0x7b, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x50, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, + 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, + 0x64, 0x73, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x6b, 0x69, 0x6e, 0x64, 0x73, + 0x12, 0x42, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0d, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x0b, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x1a, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x0b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, + 0x2a, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x5d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x45, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x50, 0x0a, + 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x12, 0x57, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x1a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x2f, 0x7b, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x32, 0x0a, 0x05, - 0x50, 0x50, 0x72, 0x6f, 0x66, 0x12, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, - 0x50, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x50, 0x72, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x00, - 0x32, 0x6b, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x57, 0x69, 0x74, - 0x68, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x75, 0x6e, 0x3a, 0x01, 0x2a, 0x32, 0xa0, 0x01, - 0x0a, 0x04, 0x4d, 0x6f, 0x63, 0x6b, 0x12, 0x4b, 0x0a, 0x06, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x63, 0x6b, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x32, 0x60, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x52, - 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, - 0x01, 0x2a, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x73, 0x75, 0x72, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2d, - 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6c, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x54, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, + 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2f, 0x7b, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x57, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x21, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1b, 0x1a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x32, + 0x0a, 0x05, 0x50, 0x50, 0x72, 0x6f, 0x66, 0x12, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x50, 0x50, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x50, 0x72, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, + 0x22, 0x00, 0x32, 0x6b, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x19, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x43, 0x61, 0x73, 0x65, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x75, 0x6e, 0x3a, 0x01, 0x2a, 0x32, + 0xa0, 0x01, 0x0a, 0x04, 0x4d, 0x6f, 0x63, 0x6b, 0x12, 0x4b, 0x0a, 0x06, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x63, 0x6b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x4b, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x32, 0x60, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x12, 0x52, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x3a, 0x01, 0x2a, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x73, 0x75, 0x72, 0x65, 0x6e, 0x2f, 0x61, 0x70, + 0x69, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4217,7 +4297,7 @@ func file_pkg_server_server_proto_rawDescGZIP() []byte { return file_pkg_server_server_proto_rawDescData } -var file_pkg_server_server_proto_msgTypes = make([]protoimpl.MessageInfo, 57) +var file_pkg_server_server_proto_msgTypes = make([]protoimpl.MessageInfo, 58) var file_pkg_server_server_proto_goTypes = []interface{}{ (*Suites)(nil), // 0: server.Suites (*Items)(nil), // 1: server.Items @@ -4273,14 +4353,15 @@ var file_pkg_server_server_proto_goTypes = []interface{}{ (*ProxyConfig)(nil), // 51: server.ProxyConfig (*DataQuery)(nil), // 52: server.DataQuery (*DataQueryResult)(nil), // 53: server.DataQueryResult - nil, // 54: server.Suites.DataEntry - nil, // 55: server.HistorySuites.DataEntry - nil, // 56: server.TestTask.EnvEntry - (*timestamppb.Timestamp)(nil), // 57: google.protobuf.Timestamp + (*DataMeta)(nil), // 54: server.DataMeta + nil, // 55: server.Suites.DataEntry + nil, // 56: server.HistorySuites.DataEntry + nil, // 57: server.TestTask.EnvEntry + (*timestamppb.Timestamp)(nil), // 58: google.protobuf.Timestamp } var file_pkg_server_server_proto_depIdxs = []int32{ - 54, // 0: server.Suites.data:type_name -> server.Suites.DataEntry - 55, // 1: server.HistorySuites.data:type_name -> server.HistorySuites.DataEntry + 55, // 0: server.Suites.data:type_name -> server.Suites.DataEntry + 56, // 1: server.HistorySuites.data:type_name -> server.HistorySuites.DataEntry 4, // 2: server.HistoryItems.data:type_name -> server.HistoryCaseIdentity 31, // 3: server.TestCaseIdentity.parameters:type_name -> server.Pair 31, // 4: server.TestSuite.param:type_name -> server.Pair @@ -4290,19 +4371,19 @@ var file_pkg_server_server_proto_depIdxs = []int32{ 24, // 8: server.TestSuiteWithCase.case:type_name -> server.TestCase 11, // 9: server.APISpec.rpc:type_name -> server.RPC 10, // 10: server.APISpec.secure:type_name -> server.Secure - 56, // 11: server.TestTask.env:type_name -> server.TestTask.EnvEntry + 57, // 11: server.TestTask.env:type_name -> server.TestTask.EnvEntry 31, // 12: server.TestTask.parameters:type_name -> server.Pair 31, // 13: server.BatchTestTask.parameters:type_name -> server.Pair 30, // 14: server.TestResult.testCaseResult:type_name -> server.TestCaseResult 30, // 15: server.HistoryTestResult.testCaseResult:type_name -> server.TestCaseResult 25, // 16: server.HistoryTestResult.data:type_name -> server.HistoryTestCase - 57, // 17: server.HistoryTestResult.createTime:type_name -> google.protobuf.Timestamp + 58, // 17: server.HistoryTestResult.createTime:type_name -> google.protobuf.Timestamp 24, // 18: server.Suite.items:type_name -> server.TestCase 24, // 19: server.TestCaseWithSuite.data:type_name -> server.TestCase 24, // 20: server.TestCases.data:type_name -> server.TestCase 27, // 21: server.TestCase.request:type_name -> server.Request 28, // 22: server.TestCase.response:type_name -> server.Response - 57, // 23: server.HistoryTestCase.createTime:type_name -> google.protobuf.Timestamp + 58, // 23: server.HistoryTestCase.createTime:type_name -> google.protobuf.Timestamp 31, // 24: server.HistoryTestCase.suiteParam:type_name -> server.Pair 9, // 25: server.HistoryTestCase.suiteSpec:type_name -> server.APISpec 27, // 26: server.HistoryTestCase.request:type_name -> server.Request @@ -4326,119 +4407,120 @@ var file_pkg_server_server_proto_depIdxs = []int32{ 43, // 44: server.Secrets.data:type_name -> server.Secret 31, // 45: server.DataQueryResult.data:type_name -> server.Pair 32, // 46: server.DataQueryResult.items:type_name -> server.Pairs - 1, // 47: server.Suites.DataEntry.value:type_name -> server.Items - 3, // 48: server.HistorySuites.DataEntry.value:type_name -> server.HistoryItems - 15, // 49: server.Runner.Run:input_type -> server.TestTask - 12, // 50: server.Runner.RunTestSuite:input_type -> server.TestSuiteIdentity - 48, // 51: server.Runner.GetSuites:input_type -> server.Empty - 12, // 52: server.Runner.CreateTestSuite:input_type -> server.TestSuiteIdentity - 6, // 53: server.Runner.ImportTestSuite:input_type -> server.TestSuiteSource - 12, // 54: server.Runner.GetTestSuite:input_type -> server.TestSuiteIdentity - 7, // 55: server.Runner.UpdateTestSuite:input_type -> server.TestSuite - 12, // 56: server.Runner.DeleteTestSuite:input_type -> server.TestSuiteIdentity - 13, // 57: server.Runner.DuplicateTestSuite:input_type -> server.TestSuiteDuplicate - 13, // 58: server.Runner.RenameTestSuite:input_type -> server.TestSuiteDuplicate - 12, // 59: server.Runner.GetTestSuiteYaml:input_type -> server.TestSuiteIdentity - 12, // 60: server.Runner.ListTestCase:input_type -> server.TestSuiteIdentity - 5, // 61: server.Runner.RunTestCase:input_type -> server.TestCaseIdentity - 16, // 62: server.Runner.BatchRun:input_type -> server.BatchTestTask - 5, // 63: server.Runner.GetTestCase:input_type -> server.TestCaseIdentity - 22, // 64: server.Runner.CreateTestCase:input_type -> server.TestCaseWithSuite - 22, // 65: server.Runner.UpdateTestCase:input_type -> server.TestCaseWithSuite - 5, // 66: server.Runner.DeleteTestCase:input_type -> server.TestCaseIdentity - 14, // 67: server.Runner.DuplicateTestCase:input_type -> server.TestCaseDuplicate - 14, // 68: server.Runner.RenameTestCase:input_type -> server.TestCaseDuplicate - 12, // 69: server.Runner.GetSuggestedAPIs:input_type -> server.TestSuiteIdentity - 48, // 70: server.Runner.GetHistorySuites:input_type -> server.Empty - 25, // 71: server.Runner.GetHistoryTestCaseWithResult:input_type -> server.HistoryTestCase - 25, // 72: server.Runner.GetHistoryTestCase:input_type -> server.HistoryTestCase - 25, // 73: server.Runner.DeleteHistoryTestCase:input_type -> server.HistoryTestCase - 25, // 74: server.Runner.DeleteAllHistoryTestCase:input_type -> server.HistoryTestCase - 24, // 75: server.Runner.GetTestCaseAllHistory:input_type -> server.TestCase - 48, // 76: server.Runner.ListCodeGenerator:input_type -> server.Empty - 41, // 77: server.Runner.GenerateCode:input_type -> server.CodeGenerateRequest - 41, // 78: server.Runner.HistoryGenerateCode:input_type -> server.CodeGenerateRequest - 48, // 79: server.Runner.ListConverter:input_type -> server.Empty - 41, // 80: server.Runner.ConvertTestSuite:input_type -> server.CodeGenerateRequest - 48, // 81: server.Runner.PopularHeaders:input_type -> server.Empty - 33, // 82: server.Runner.FunctionsQuery:input_type -> server.SimpleQuery - 33, // 83: server.Runner.FunctionsQueryStream:input_type -> server.SimpleQuery - 48, // 84: server.Runner.GetVersion:input_type -> server.Empty - 48, // 85: server.Runner.Sample:input_type -> server.Empty - 24, // 86: server.Runner.DownloadResponseFile:input_type -> server.TestCase - 48, // 87: server.Runner.GetStoreKinds:input_type -> server.Empty - 48, // 88: server.Runner.GetStores:input_type -> server.Empty - 35, // 89: server.Runner.CreateStore:input_type -> server.Store - 35, // 90: server.Runner.UpdateStore:input_type -> server.Store - 35, // 91: server.Runner.DeleteStore:input_type -> server.Store - 33, // 92: server.Runner.VerifyStore:input_type -> server.SimpleQuery - 48, // 93: server.Runner.GetSecrets:input_type -> server.Empty - 43, // 94: server.Runner.CreateSecret:input_type -> server.Secret - 43, // 95: server.Runner.DeleteSecret:input_type -> server.Secret - 43, // 96: server.Runner.UpdateSecret:input_type -> server.Secret - 45, // 97: server.Runner.PProf:input_type -> server.PProfRequest - 8, // 98: server.RunnerExtension.Run:input_type -> server.TestSuiteWithCase - 49, // 99: server.Mock.Reload:input_type -> server.MockConfig - 48, // 100: server.Mock.GetConfig:input_type -> server.Empty - 52, // 101: server.DataServer.Query:input_type -> server.DataQuery - 17, // 102: server.Runner.Run:output_type -> server.TestResult - 17, // 103: server.Runner.RunTestSuite:output_type -> server.TestResult - 0, // 104: server.Runner.GetSuites:output_type -> server.Suites - 19, // 105: server.Runner.CreateTestSuite:output_type -> server.HelloReply - 38, // 106: server.Runner.ImportTestSuite:output_type -> server.CommonResult - 7, // 107: server.Runner.GetTestSuite:output_type -> server.TestSuite - 19, // 108: server.Runner.UpdateTestSuite:output_type -> server.HelloReply - 19, // 109: server.Runner.DeleteTestSuite:output_type -> server.HelloReply - 19, // 110: server.Runner.DuplicateTestSuite:output_type -> server.HelloReply - 19, // 111: server.Runner.RenameTestSuite:output_type -> server.HelloReply - 20, // 112: server.Runner.GetTestSuiteYaml:output_type -> server.YamlData - 21, // 113: server.Runner.ListTestCase:output_type -> server.Suite - 30, // 114: server.Runner.RunTestCase:output_type -> server.TestCaseResult - 17, // 115: server.Runner.BatchRun:output_type -> server.TestResult - 24, // 116: server.Runner.GetTestCase:output_type -> server.TestCase - 19, // 117: server.Runner.CreateTestCase:output_type -> server.HelloReply - 19, // 118: server.Runner.UpdateTestCase:output_type -> server.HelloReply - 19, // 119: server.Runner.DeleteTestCase:output_type -> server.HelloReply - 19, // 120: server.Runner.DuplicateTestCase:output_type -> server.HelloReply - 19, // 121: server.Runner.RenameTestCase:output_type -> server.HelloReply - 23, // 122: server.Runner.GetSuggestedAPIs:output_type -> server.TestCases - 2, // 123: server.Runner.GetHistorySuites:output_type -> server.HistorySuites - 18, // 124: server.Runner.GetHistoryTestCaseWithResult:output_type -> server.HistoryTestResult - 25, // 125: server.Runner.GetHistoryTestCase:output_type -> server.HistoryTestCase - 19, // 126: server.Runner.DeleteHistoryTestCase:output_type -> server.HelloReply - 19, // 127: server.Runner.DeleteAllHistoryTestCase:output_type -> server.HelloReply - 26, // 128: server.Runner.GetTestCaseAllHistory:output_type -> server.HistoryTestCases - 39, // 129: server.Runner.ListCodeGenerator:output_type -> server.SimpleList - 38, // 130: server.Runner.GenerateCode:output_type -> server.CommonResult - 38, // 131: server.Runner.HistoryGenerateCode:output_type -> server.CommonResult - 39, // 132: server.Runner.ListConverter:output_type -> server.SimpleList - 38, // 133: server.Runner.ConvertTestSuite:output_type -> server.CommonResult - 32, // 134: server.Runner.PopularHeaders:output_type -> server.Pairs - 32, // 135: server.Runner.FunctionsQuery:output_type -> server.Pairs - 32, // 136: server.Runner.FunctionsQueryStream:output_type -> server.Pairs - 50, // 137: server.Runner.GetVersion:output_type -> server.Version - 19, // 138: server.Runner.Sample:output_type -> server.HelloReply - 47, // 139: server.Runner.DownloadResponseFile:output_type -> server.FileData - 36, // 140: server.Runner.GetStoreKinds:output_type -> server.StoreKinds - 34, // 141: server.Runner.GetStores:output_type -> server.Stores - 35, // 142: server.Runner.CreateStore:output_type -> server.Store - 35, // 143: server.Runner.UpdateStore:output_type -> server.Store - 35, // 144: server.Runner.DeleteStore:output_type -> server.Store - 44, // 145: server.Runner.VerifyStore:output_type -> server.ExtensionStatus - 42, // 146: server.Runner.GetSecrets:output_type -> server.Secrets - 38, // 147: server.Runner.CreateSecret:output_type -> server.CommonResult - 38, // 148: server.Runner.DeleteSecret:output_type -> server.CommonResult - 38, // 149: server.Runner.UpdateSecret:output_type -> server.CommonResult - 46, // 150: server.Runner.PProf:output_type -> server.PProfData - 38, // 151: server.RunnerExtension.Run:output_type -> server.CommonResult - 48, // 152: server.Mock.Reload:output_type -> server.Empty - 49, // 153: server.Mock.GetConfig:output_type -> server.MockConfig - 53, // 154: server.DataServer.Query:output_type -> server.DataQueryResult - 102, // [102:155] is the sub-list for method output_type - 49, // [49:102] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 54, // 47: server.DataQueryResult.meta:type_name -> server.DataMeta + 1, // 48: server.Suites.DataEntry.value:type_name -> server.Items + 3, // 49: server.HistorySuites.DataEntry.value:type_name -> server.HistoryItems + 15, // 50: server.Runner.Run:input_type -> server.TestTask + 12, // 51: server.Runner.RunTestSuite:input_type -> server.TestSuiteIdentity + 48, // 52: server.Runner.GetSuites:input_type -> server.Empty + 12, // 53: server.Runner.CreateTestSuite:input_type -> server.TestSuiteIdentity + 6, // 54: server.Runner.ImportTestSuite:input_type -> server.TestSuiteSource + 12, // 55: server.Runner.GetTestSuite:input_type -> server.TestSuiteIdentity + 7, // 56: server.Runner.UpdateTestSuite:input_type -> server.TestSuite + 12, // 57: server.Runner.DeleteTestSuite:input_type -> server.TestSuiteIdentity + 13, // 58: server.Runner.DuplicateTestSuite:input_type -> server.TestSuiteDuplicate + 13, // 59: server.Runner.RenameTestSuite:input_type -> server.TestSuiteDuplicate + 12, // 60: server.Runner.GetTestSuiteYaml:input_type -> server.TestSuiteIdentity + 12, // 61: server.Runner.ListTestCase:input_type -> server.TestSuiteIdentity + 5, // 62: server.Runner.RunTestCase:input_type -> server.TestCaseIdentity + 16, // 63: server.Runner.BatchRun:input_type -> server.BatchTestTask + 5, // 64: server.Runner.GetTestCase:input_type -> server.TestCaseIdentity + 22, // 65: server.Runner.CreateTestCase:input_type -> server.TestCaseWithSuite + 22, // 66: server.Runner.UpdateTestCase:input_type -> server.TestCaseWithSuite + 5, // 67: server.Runner.DeleteTestCase:input_type -> server.TestCaseIdentity + 14, // 68: server.Runner.DuplicateTestCase:input_type -> server.TestCaseDuplicate + 14, // 69: server.Runner.RenameTestCase:input_type -> server.TestCaseDuplicate + 12, // 70: server.Runner.GetSuggestedAPIs:input_type -> server.TestSuiteIdentity + 48, // 71: server.Runner.GetHistorySuites:input_type -> server.Empty + 25, // 72: server.Runner.GetHistoryTestCaseWithResult:input_type -> server.HistoryTestCase + 25, // 73: server.Runner.GetHistoryTestCase:input_type -> server.HistoryTestCase + 25, // 74: server.Runner.DeleteHistoryTestCase:input_type -> server.HistoryTestCase + 25, // 75: server.Runner.DeleteAllHistoryTestCase:input_type -> server.HistoryTestCase + 24, // 76: server.Runner.GetTestCaseAllHistory:input_type -> server.TestCase + 48, // 77: server.Runner.ListCodeGenerator:input_type -> server.Empty + 41, // 78: server.Runner.GenerateCode:input_type -> server.CodeGenerateRequest + 41, // 79: server.Runner.HistoryGenerateCode:input_type -> server.CodeGenerateRequest + 48, // 80: server.Runner.ListConverter:input_type -> server.Empty + 41, // 81: server.Runner.ConvertTestSuite:input_type -> server.CodeGenerateRequest + 48, // 82: server.Runner.PopularHeaders:input_type -> server.Empty + 33, // 83: server.Runner.FunctionsQuery:input_type -> server.SimpleQuery + 33, // 84: server.Runner.FunctionsQueryStream:input_type -> server.SimpleQuery + 48, // 85: server.Runner.GetVersion:input_type -> server.Empty + 48, // 86: server.Runner.Sample:input_type -> server.Empty + 24, // 87: server.Runner.DownloadResponseFile:input_type -> server.TestCase + 48, // 88: server.Runner.GetStoreKinds:input_type -> server.Empty + 48, // 89: server.Runner.GetStores:input_type -> server.Empty + 35, // 90: server.Runner.CreateStore:input_type -> server.Store + 35, // 91: server.Runner.UpdateStore:input_type -> server.Store + 35, // 92: server.Runner.DeleteStore:input_type -> server.Store + 33, // 93: server.Runner.VerifyStore:input_type -> server.SimpleQuery + 48, // 94: server.Runner.GetSecrets:input_type -> server.Empty + 43, // 95: server.Runner.CreateSecret:input_type -> server.Secret + 43, // 96: server.Runner.DeleteSecret:input_type -> server.Secret + 43, // 97: server.Runner.UpdateSecret:input_type -> server.Secret + 45, // 98: server.Runner.PProf:input_type -> server.PProfRequest + 8, // 99: server.RunnerExtension.Run:input_type -> server.TestSuiteWithCase + 49, // 100: server.Mock.Reload:input_type -> server.MockConfig + 48, // 101: server.Mock.GetConfig:input_type -> server.Empty + 52, // 102: server.DataServer.Query:input_type -> server.DataQuery + 17, // 103: server.Runner.Run:output_type -> server.TestResult + 17, // 104: server.Runner.RunTestSuite:output_type -> server.TestResult + 0, // 105: server.Runner.GetSuites:output_type -> server.Suites + 19, // 106: server.Runner.CreateTestSuite:output_type -> server.HelloReply + 38, // 107: server.Runner.ImportTestSuite:output_type -> server.CommonResult + 7, // 108: server.Runner.GetTestSuite:output_type -> server.TestSuite + 19, // 109: server.Runner.UpdateTestSuite:output_type -> server.HelloReply + 19, // 110: server.Runner.DeleteTestSuite:output_type -> server.HelloReply + 19, // 111: server.Runner.DuplicateTestSuite:output_type -> server.HelloReply + 19, // 112: server.Runner.RenameTestSuite:output_type -> server.HelloReply + 20, // 113: server.Runner.GetTestSuiteYaml:output_type -> server.YamlData + 21, // 114: server.Runner.ListTestCase:output_type -> server.Suite + 30, // 115: server.Runner.RunTestCase:output_type -> server.TestCaseResult + 17, // 116: server.Runner.BatchRun:output_type -> server.TestResult + 24, // 117: server.Runner.GetTestCase:output_type -> server.TestCase + 19, // 118: server.Runner.CreateTestCase:output_type -> server.HelloReply + 19, // 119: server.Runner.UpdateTestCase:output_type -> server.HelloReply + 19, // 120: server.Runner.DeleteTestCase:output_type -> server.HelloReply + 19, // 121: server.Runner.DuplicateTestCase:output_type -> server.HelloReply + 19, // 122: server.Runner.RenameTestCase:output_type -> server.HelloReply + 23, // 123: server.Runner.GetSuggestedAPIs:output_type -> server.TestCases + 2, // 124: server.Runner.GetHistorySuites:output_type -> server.HistorySuites + 18, // 125: server.Runner.GetHistoryTestCaseWithResult:output_type -> server.HistoryTestResult + 25, // 126: server.Runner.GetHistoryTestCase:output_type -> server.HistoryTestCase + 19, // 127: server.Runner.DeleteHistoryTestCase:output_type -> server.HelloReply + 19, // 128: server.Runner.DeleteAllHistoryTestCase:output_type -> server.HelloReply + 26, // 129: server.Runner.GetTestCaseAllHistory:output_type -> server.HistoryTestCases + 39, // 130: server.Runner.ListCodeGenerator:output_type -> server.SimpleList + 38, // 131: server.Runner.GenerateCode:output_type -> server.CommonResult + 38, // 132: server.Runner.HistoryGenerateCode:output_type -> server.CommonResult + 39, // 133: server.Runner.ListConverter:output_type -> server.SimpleList + 38, // 134: server.Runner.ConvertTestSuite:output_type -> server.CommonResult + 32, // 135: server.Runner.PopularHeaders:output_type -> server.Pairs + 32, // 136: server.Runner.FunctionsQuery:output_type -> server.Pairs + 32, // 137: server.Runner.FunctionsQueryStream:output_type -> server.Pairs + 50, // 138: server.Runner.GetVersion:output_type -> server.Version + 19, // 139: server.Runner.Sample:output_type -> server.HelloReply + 47, // 140: server.Runner.DownloadResponseFile:output_type -> server.FileData + 36, // 141: server.Runner.GetStoreKinds:output_type -> server.StoreKinds + 34, // 142: server.Runner.GetStores:output_type -> server.Stores + 35, // 143: server.Runner.CreateStore:output_type -> server.Store + 35, // 144: server.Runner.UpdateStore:output_type -> server.Store + 35, // 145: server.Runner.DeleteStore:output_type -> server.Store + 44, // 146: server.Runner.VerifyStore:output_type -> server.ExtensionStatus + 42, // 147: server.Runner.GetSecrets:output_type -> server.Secrets + 38, // 148: server.Runner.CreateSecret:output_type -> server.CommonResult + 38, // 149: server.Runner.DeleteSecret:output_type -> server.CommonResult + 38, // 150: server.Runner.UpdateSecret:output_type -> server.CommonResult + 46, // 151: server.Runner.PProf:output_type -> server.PProfData + 38, // 152: server.RunnerExtension.Run:output_type -> server.CommonResult + 48, // 153: server.Mock.Reload:output_type -> server.Empty + 49, // 154: server.Mock.GetConfig:output_type -> server.MockConfig + 53, // 155: server.DataServer.Query:output_type -> server.DataQueryResult + 103, // [103:156] is the sub-list for method output_type + 50, // [50:103] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_pkg_server_server_proto_init() } @@ -5095,6 +5177,18 @@ func file_pkg_server_server_proto_init() { return nil } } + file_pkg_server_server_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -5102,7 +5196,7 @@ func file_pkg_server_server_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_pkg_server_server_proto_rawDesc, NumEnums: 0, - NumMessages: 57, + NumMessages: 58, NumExtensions: 0, NumServices: 4, }, diff --git a/pkg/server/server.pb.gw.go b/pkg/server/server.pb.gw.go index b28e0dc..260d4b2 100644 --- a/pkg/server/server.pb.gw.go +++ b/pkg/server/server.pb.gw.go @@ -35,7 +35,11 @@ func request_Runner_Run_0(ctx context.Context, marshaler runtime.Marshaler, clie var protoReq TestTask var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -48,7 +52,11 @@ func local_request_Runner_Run_0(ctx context.Context, marshaler runtime.Marshaler var protoReq TestTask var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -122,7 +130,11 @@ func request_Runner_CreateTestSuite_0(ctx context.Context, marshaler runtime.Mar var protoReq TestSuiteIdentity var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -135,7 +147,11 @@ func local_request_Runner_CreateTestSuite_0(ctx context.Context, marshaler runti var protoReq TestSuiteIdentity var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -148,7 +164,11 @@ func request_Runner_ImportTestSuite_0(ctx context.Context, marshaler runtime.Mar var protoReq TestSuiteSource var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -161,7 +181,11 @@ func local_request_Runner_ImportTestSuite_0(ctx context.Context, marshaler runti var protoReq TestSuiteSource var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,7 +195,7 @@ func local_request_Runner_ImportTestSuite_0(ctx context.Context, marshaler runti } var ( - filter_Runner_GetTestSuite_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_GetTestSuite_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_GetTestSuite_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -244,7 +268,11 @@ func request_Runner_UpdateTestSuite_0(ctx context.Context, marshaler runtime.Mar var protoReq TestSuite var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -274,7 +302,11 @@ func local_request_Runner_UpdateTestSuite_0(ctx context.Context, marshaler runti var protoReq TestSuite var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -301,7 +333,7 @@ func local_request_Runner_UpdateTestSuite_0(ctx context.Context, marshaler runti } var ( - filter_Runner_DeleteTestSuite_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_DeleteTestSuite_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_DeleteTestSuite_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -374,7 +406,11 @@ func request_Runner_DuplicateTestSuite_0(ctx context.Context, marshaler runtime. var protoReq TestSuiteDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -404,7 +440,11 @@ func local_request_Runner_DuplicateTestSuite_0(ctx context.Context, marshaler ru var protoReq TestSuiteDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -434,7 +474,11 @@ func request_Runner_RenameTestSuite_0(ctx context.Context, marshaler runtime.Mar var protoReq TestSuiteDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -464,7 +508,11 @@ func local_request_Runner_RenameTestSuite_0(ctx context.Context, marshaler runti var protoReq TestSuiteDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -491,7 +539,7 @@ func local_request_Runner_RenameTestSuite_0(ctx context.Context, marshaler runti } var ( - filter_Runner_GetTestSuiteYaml_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_GetTestSuiteYaml_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_GetTestSuiteYaml_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -561,7 +609,7 @@ func local_request_Runner_GetTestSuiteYaml_0(ctx context.Context, marshaler runt } var ( - filter_Runner_ListTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_ListTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_ListTestCase_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -634,7 +682,11 @@ func request_Runner_RunTestCase_0(ctx context.Context, marshaler runtime.Marshal var protoReq TestCaseIdentity var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -674,7 +726,11 @@ func local_request_Runner_RunTestCase_0(ctx context.Context, marshaler runtime.M var protoReq TestCaseIdentity var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -754,7 +810,7 @@ func request_Runner_BatchRun_0(ctx context.Context, marshaler runtime.Marshaler, } var ( - filter_Runner_GetTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"suite": 0, "testcase": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Runner_GetTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"suite": 0, "testcase": 1}, Base: []int{1, 2, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 2, 3, 3}} ) func request_Runner_GetTestCase_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -847,7 +903,11 @@ func request_Runner_CreateTestCase_0(ctx context.Context, marshaler runtime.Mars var protoReq TestCaseWithSuite var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -877,7 +937,11 @@ func local_request_Runner_CreateTestCase_0(ctx context.Context, marshaler runtim var protoReq TestCaseWithSuite var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -907,7 +971,11 @@ func request_Runner_UpdateTestCase_0(ctx context.Context, marshaler runtime.Mars var protoReq TestCaseWithSuite var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -947,7 +1015,11 @@ func local_request_Runner_UpdateTestCase_0(ctx context.Context, marshaler runtim var protoReq TestCaseWithSuite var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -984,7 +1056,7 @@ func local_request_Runner_UpdateTestCase_0(ctx context.Context, marshaler runtim } var ( - filter_Runner_DeleteTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"suite": 0, "testcase": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Runner_DeleteTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"suite": 0, "testcase": 1}, Base: []int{1, 2, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 2, 3, 3}} ) func request_Runner_DeleteTestCase_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1077,7 +1149,11 @@ func request_Runner_DuplicateTestCase_0(ctx context.Context, marshaler runtime.M var protoReq TestCaseDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1117,7 +1193,11 @@ func local_request_Runner_DuplicateTestCase_0(ctx context.Context, marshaler run var protoReq TestCaseDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1157,7 +1237,11 @@ func request_Runner_RenameTestCase_0(ctx context.Context, marshaler runtime.Mars var protoReq TestCaseDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1197,7 +1281,11 @@ func local_request_Runner_RenameTestCase_0(ctx context.Context, marshaler runtim var protoReq TestCaseDuplicate var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1288,7 +1376,7 @@ func local_request_Runner_GetHistorySuites_0(ctx context.Context, marshaler runt } var ( - filter_Runner_GetHistoryTestCaseWithResult_0 = &utilities.DoubleArray{Encoding: map[string]int{"ID": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_GetHistoryTestCaseWithResult_0 = &utilities.DoubleArray{Encoding: map[string]int{"ID": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_GetHistoryTestCaseWithResult_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1358,7 +1446,7 @@ func local_request_Runner_GetHistoryTestCaseWithResult_0(ctx context.Context, ma } var ( - filter_Runner_GetHistoryTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"ID": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_GetHistoryTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"ID": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_GetHistoryTestCase_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1428,7 +1516,7 @@ func local_request_Runner_GetHistoryTestCase_0(ctx context.Context, marshaler ru } var ( - filter_Runner_DeleteHistoryTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"ID": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_DeleteHistoryTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"ID": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_DeleteHistoryTestCase_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1498,7 +1586,7 @@ func local_request_Runner_DeleteHistoryTestCase_0(ctx context.Context, marshaler } var ( - filter_Runner_DeleteAllHistoryTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"suiteName": 0, "caseName": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Runner_DeleteAllHistoryTestCase_0 = &utilities.DoubleArray{Encoding: map[string]int{"suiteName": 0, "caseName": 1}, Base: []int{1, 2, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 2, 3, 3}} ) func request_Runner_DeleteAllHistoryTestCase_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1588,7 +1676,7 @@ func local_request_Runner_DeleteAllHistoryTestCase_0(ctx context.Context, marsha } var ( - filter_Runner_GetTestCaseAllHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"suiteName": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Runner_GetTestCaseAllHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"suiteName": 0, "name": 1}, Base: []int{1, 2, 4, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 2, 3, 3}} ) func request_Runner_GetTestCaseAllHistory_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1699,7 +1787,11 @@ func request_Runner_GenerateCode_0(ctx context.Context, marshaler runtime.Marsha var protoReq CodeGenerateRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1712,7 +1804,11 @@ func local_request_Runner_GenerateCode_0(ctx context.Context, marshaler runtime. var protoReq CodeGenerateRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1725,7 +1821,11 @@ func request_Runner_HistoryGenerateCode_0(ctx context.Context, marshaler runtime var protoReq CodeGenerateRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1738,7 +1838,11 @@ func local_request_Runner_HistoryGenerateCode_0(ctx context.Context, marshaler r var protoReq CodeGenerateRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1769,7 +1873,11 @@ func request_Runner_ConvertTestSuite_0(ctx context.Context, marshaler runtime.Ma var protoReq CodeGenerateRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1782,7 +1890,11 @@ func local_request_Runner_ConvertTestSuite_0(ctx context.Context, marshaler runt var protoReq CodeGenerateRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1928,7 +2040,11 @@ func request_Runner_DownloadResponseFile_0(ctx context.Context, marshaler runtim var protoReq TestCase var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1958,7 +2074,11 @@ func local_request_Runner_DownloadResponseFile_0(ctx context.Context, marshaler var protoReq TestCase var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2024,7 +2144,11 @@ func request_Runner_CreateStore_0(ctx context.Context, marshaler runtime.Marshal var protoReq Store var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2037,7 +2161,11 @@ func local_request_Runner_CreateStore_0(ctx context.Context, marshaler runtime.M var protoReq Store var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2050,7 +2178,11 @@ func request_Runner_UpdateStore_0(ctx context.Context, marshaler runtime.Marshal var protoReq Store var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2080,7 +2212,11 @@ func local_request_Runner_UpdateStore_0(ctx context.Context, marshaler runtime.M var protoReq Store var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2107,7 +2243,7 @@ func local_request_Runner_UpdateStore_0(ctx context.Context, marshaler runtime.M } var ( - filter_Runner_DeleteStore_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_DeleteStore_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_DeleteStore_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -2180,7 +2316,11 @@ func request_Runner_VerifyStore_0(ctx context.Context, marshaler runtime.Marshal var protoReq SimpleQuery var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2193,7 +2333,11 @@ func local_request_Runner_VerifyStore_0(ctx context.Context, marshaler runtime.M var protoReq SimpleQuery var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2224,7 +2368,11 @@ func request_Runner_CreateSecret_0(ctx context.Context, marshaler runtime.Marsha var protoReq Secret var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2237,7 +2385,11 @@ func local_request_Runner_CreateSecret_0(ctx context.Context, marshaler runtime. var protoReq Secret var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2247,7 +2399,7 @@ func local_request_Runner_CreateSecret_0(ctx context.Context, marshaler runtime. } var ( - filter_Runner_DeleteSecret_0 = &utilities.DoubleArray{Encoding: map[string]int{"Name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Runner_DeleteSecret_0 = &utilities.DoubleArray{Encoding: map[string]int{"Name": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} ) func request_Runner_DeleteSecret_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -2320,7 +2472,11 @@ func request_Runner_UpdateSecret_0(ctx context.Context, marshaler runtime.Marsha var protoReq Secret var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2350,7 +2506,11 @@ func local_request_Runner_UpdateSecret_0(ctx context.Context, marshaler runtime. var protoReq Secret var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2380,7 +2540,11 @@ func request_Runner_PProf_0(ctx context.Context, marshaler runtime.Marshaler, cl var protoReq PProfRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2393,7 +2557,11 @@ func local_request_Runner_PProf_0(ctx context.Context, marshaler runtime.Marshal var protoReq PProfRequest var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2406,7 +2574,11 @@ func request_RunnerExtension_Run_0(ctx context.Context, marshaler runtime.Marsha var protoReq TestSuiteWithCase var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2419,7 +2591,11 @@ func local_request_RunnerExtension_Run_0(ctx context.Context, marshaler runtime. var protoReq TestSuiteWithCase var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2432,7 +2608,11 @@ func request_Mock_Reload_0(ctx context.Context, marshaler runtime.Marshaler, cli var protoReq MockConfig var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2445,7 +2625,11 @@ func local_request_Mock_Reload_0(ctx context.Context, marshaler runtime.Marshale var protoReq MockConfig var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2476,7 +2660,11 @@ func request_DataServer_Query_0(ctx context.Context, marshaler runtime.Marshaler var protoReq DataQuery var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2489,7 +2677,11 @@ func local_request_DataServer_Query_0(ctx context.Context, marshaler runtime.Mar var protoReq DataQuery var metadata runtime.ServerMetadata - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } diff --git a/pkg/server/server.proto b/pkg/server/server.proto index c04300d..d5f2f21 100644 --- a/pkg/server/server.proto +++ b/pkg/server/server.proto @@ -663,4 +663,11 @@ message DataQuery { message DataQueryResult { repeated Pair data = 1; repeated Pairs items = 2; + DataMeta meta = 3; +} + +message DataMeta { + repeated string databases = 1; + repeated string tables = 2; + string currentDatabase = 3; } diff --git a/pkg/server/server_grpc.pb.go b/pkg/server/server_grpc.pb.go index 529234c..1ace149 100644 --- a/pkg/server/server_grpc.pb.go +++ b/pkg/server/server_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v4.25.1 +// - protoc v4.22.2 // source: pkg/server/server.proto package server diff --git a/pkg/testing/loader.go b/pkg/testing/loader.go index 81cc44a..718e588 100644 --- a/pkg/testing/loader.go +++ b/pkg/testing/loader.go @@ -27,7 +27,15 @@ type Loader interface { Verify() (readOnly bool, err error) PProf(name string) []byte - Query(query map[string]string) (result map[string]string, items []map[string]string, err error) + Query(query map[string]string) (result DataResult, err error) +} + +type DataResult struct { + Pairs map[string]string + Rows []map[string]string + Databases []string + Tables []string + CurrentDatabase string } type Writer interface { diff --git a/pkg/testing/loader_file.go b/pkg/testing/loader_file.go index a686f5f..c3bcb8c 100644 --- a/pkg/testing/loader_file.go +++ b/pkg/testing/loader_file.go @@ -515,8 +515,8 @@ func (l *fileLoader) Close() { // not support } -func (l *fileLoader) Query(query map[string]string) (result map[string]string, items []map[string]string, err error) { - result = map[string]string{ +func (l *fileLoader) Query(query map[string]string) (result DataResult, err error) { + result.Pairs = map[string]string{ "message": "not support", } return diff --git a/pkg/testing/loader_non.go b/pkg/testing/loader_non.go index 9ab0bcd..1a6af49 100644 --- a/pkg/testing/loader_non.go +++ b/pkg/testing/loader_non.go @@ -150,6 +150,6 @@ func (l *nonLoader) Close() { // not support } -func (l *nonLoader) Query(query map[string]string) (result map[string]string, items []map[string]string, err error) { +func (l *nonLoader) Query(query map[string]string) (result DataResult, err error) { return } diff --git a/pkg/testing/remote/grpc_store.go b/pkg/testing/remote/grpc_store.go index bf1c26e..58ba9b1 100644 --- a/pkg/testing/remote/grpc_store.go +++ b/pkg/testing/remote/grpc_store.go @@ -17,311 +17,314 @@ limitations under the License. package remote import ( - context "context" - "errors" - "time" + context "context" + "errors" + "time" - "github.com/linuxsuren/api-testing/pkg/logging" - server "github.com/linuxsuren/api-testing/pkg/server" - "github.com/linuxsuren/api-testing/pkg/testing" + "github.com/linuxsuren/api-testing/pkg/logging" + server "github.com/linuxsuren/api-testing/pkg/server" + "github.com/linuxsuren/api-testing/pkg/testing" - "google.golang.org/grpc" + "google.golang.org/grpc" ) var ( - grpcLogger = logging.DefaultLogger(logging.LogLevelInfo).WithName("grpc") + grpcLogger = logging.DefaultLogger(logging.LogLevelInfo).WithName("grpc") ) type gRPCLoader struct { - store *testing.Store - client LoaderClient - ctx context.Context - conn *grpc.ClientConn + store *testing.Store + client LoaderClient + ctx context.Context + conn *grpc.ClientConn } func NewGRPCloaderFromStore() testing.StoreWriterFactory { - return &gRPCLoader{} + return &gRPCLoader{} } func (g *gRPCLoader) NewInstance(store testing.Store) (writer testing.Writer, err error) { - address := store.Kind.URL + address := store.Kind.URL - var conn *grpc.ClientConn - if conn, err = grpc.Dial(address, grpc.WithInsecure()); err == nil { - writer = &gRPCLoader{ - store: &store, - ctx: WithStoreContext(context.Background(), &store), - client: NewLoaderClient(conn), - conn: conn, - } - } - return + var conn *grpc.ClientConn + if conn, err = grpc.Dial(address, grpc.WithInsecure()); err == nil { + writer = &gRPCLoader{ + store: &store, + ctx: WithStoreContext(context.Background(), &store), + client: NewLoaderClient(conn), + conn: conn, + } + } + return } func (g *gRPCLoader) HasMore() bool { - // nothing to do - return false + // nothing to do + return false } func (g *gRPCLoader) Load() ([]byte, error) { - // nothing to do - return nil, nil + // nothing to do + return nil, nil } func (g *gRPCLoader) Put(path string) error { - // nothing to do - return nil + // nothing to do + return nil } func (g *gRPCLoader) GetContext() string { - // nothing to do - return "" + // nothing to do + return "" } func (g *gRPCLoader) GetCount() int { - // nothing to do - return 0 + // nothing to do + return 0 } func (g *gRPCLoader) Reset() { - // nothing to do + // nothing to do } func (g *gRPCLoader) GetTestSuiteYaml(suite string) (testSuiteYaml []byte, err error) { - var testSuite testing.TestSuite - if testSuite, err = g.GetTestSuite(suite, true); err == nil { - testSuiteYaml, err = testing.ToYAML(&testSuite) - } - return + var testSuite testing.TestSuite + if testSuite, err = g.GetTestSuite(suite, true); err == nil { + testSuiteYaml, err = testing.ToYAML(&testSuite) + } + return } func (g *gRPCLoader) ListTestCase(suite string) (testcases []testing.TestCase, err error) { - var testCases *server.TestCases - testCases, err = g.client.ListTestCases(g.ctx, &TestSuite{ - Name: suite, - }) + var testCases *server.TestCases + testCases, err = g.client.ListTestCases(g.ctx, &TestSuite{ + Name: suite, + }) - if err == nil && testCases.Data != nil { - for _, item := range testCases.Data { - if item.Name == "" { - continue - } - testcases = append(testcases, ConvertToNormalTestCase(item)) - } - } - return + if err == nil && testCases.Data != nil { + for _, item := range testCases.Data { + if item.Name == "" { + continue + } + testcases = append(testcases, ConvertToNormalTestCase(item)) + } + } + return } func (g *gRPCLoader) GetTestCase(suite, name string) (testcase testing.TestCase, err error) { - var result *server.TestCase - result, err = g.client.GetTestCase(g.ctx, &server.TestCase{ - Name: name, - SuiteName: suite, - }) - if err == nil && result != nil { - testcase = ConvertToNormalTestCase(result) - } - return + var result *server.TestCase + result, err = g.client.GetTestCase(g.ctx, &server.TestCase{ + Name: name, + SuiteName: suite, + }) + if err == nil && result != nil { + testcase = ConvertToNormalTestCase(result) + } + return } func (g *gRPCLoader) GetHistoryTestCaseWithResult(id string) (result testing.HistoryTestResult, err error) { - var historyTestResult *server.HistoryTestResult - historyTestResult, err = g.client.GetHistoryTestCaseWithResult(g.ctx, &server.HistoryTestCase{ - ID: id, - }) - if err == nil && historyTestResult != nil { - result = ConvertToNormalTestCaseResult(historyTestResult) - } - return + var historyTestResult *server.HistoryTestResult + historyTestResult, err = g.client.GetHistoryTestCaseWithResult(g.ctx, &server.HistoryTestCase{ + ID: id, + }) + if err == nil && historyTestResult != nil { + result = ConvertToNormalTestCaseResult(historyTestResult) + } + return } func (g *gRPCLoader) GetHistoryTestCase(id string) (result testing.HistoryTestCase, err error) { - var historyTestCase *server.HistoryTestCase - historyTestCase, err = g.client.GetHistoryTestCase(g.ctx, &server.HistoryTestCase{ - ID: id, - }) - if err == nil && historyTestCase != nil { - result = ConvertToNormalHistoryTestCase(historyTestCase) - } - return + var historyTestCase *server.HistoryTestCase + historyTestCase, err = g.client.GetHistoryTestCase(g.ctx, &server.HistoryTestCase{ + ID: id, + }) + if err == nil && historyTestCase != nil { + result = ConvertToNormalHistoryTestCase(historyTestCase) + } + return } func (g *gRPCLoader) CreateTestCase(suite string, testcase testing.TestCase) (err error) { - payload := ConvertToGRPCTestCase(testcase) - payload.SuiteName = suite - _, err = g.client.CreateTestCase(g.ctx, payload) - return + payload := ConvertToGRPCTestCase(testcase) + payload.SuiteName = suite + _, err = g.client.CreateTestCase(g.ctx, payload) + return } func (g *gRPCLoader) UpdateTestCase(suite string, testcase testing.TestCase) (err error) { - payload := ConvertToGRPCTestCase(testcase) - payload.SuiteName = suite - _, err = g.client.UpdateTestCase(g.ctx, payload) - return + payload := ConvertToGRPCTestCase(testcase) + payload.SuiteName = suite + _, err = g.client.UpdateTestCase(g.ctx, payload) + return } func (g *gRPCLoader) DeleteTestCase(suite, testcase string) (err error) { - _, err = g.client.DeleteTestCase(g.ctx, &server.TestCase{ - Name: testcase, - SuiteName: suite, - }) - return + _, err = g.client.DeleteTestCase(g.ctx, &server.TestCase{ + Name: testcase, + SuiteName: suite, + }) + return } func (g *gRPCLoader) RenameTestCase(suite, oldName, newName string) (err error) { - _, err = g.client.RenameTestCase(g.ctx, &server.TestCaseDuplicate{ - SourceCaseName: oldName, - SourceSuiteName: suite, - TargetCaseName: newName, - }) - return + _, err = g.client.RenameTestCase(g.ctx, &server.TestCaseDuplicate{ + SourceCaseName: oldName, + SourceSuiteName: suite, + TargetCaseName: newName, + }) + return } func (g *gRPCLoader) CreateHistoryTestCase(testcaseResult testing.TestCaseResult, testSuite *testing.TestSuite, historyHeader map[string]string) (err error) { - payload := ConvertToGRPCHistoryTestCaseResult(testcaseResult, testSuite, historyHeader) - _, err = g.client.CreateTestCaseHistory(g.ctx, payload) - return + payload := ConvertToGRPCHistoryTestCaseResult(testcaseResult, testSuite, historyHeader) + _, err = g.client.CreateTestCaseHistory(g.ctx, payload) + return } func (g *gRPCLoader) ListHistoryTestSuite() (suites []testing.HistoryTestSuite, err error) { - var items *HistoryTestSuites - items, err = g.client.ListHistoryTestSuite(g.ctx, &server.Empty{}) - if err == nil && items != nil { - for _, item := range items.Data { - suites = append(suites, *ConvertToNormalHistoryTestSuite(item)) - } - } - return + var items *HistoryTestSuites + items, err = g.client.ListHistoryTestSuite(g.ctx, &server.Empty{}) + if err == nil && items != nil { + for _, item := range items.Data { + suites = append(suites, *ConvertToNormalHistoryTestSuite(item)) + } + } + return } func (g *gRPCLoader) DeleteHistoryTestCase(id string) (err error) { - _, err = g.client.DeleteHistoryTestCase(g.ctx, &server.HistoryTestCase{ - ID: id, - }) - return + _, err = g.client.DeleteHistoryTestCase(g.ctx, &server.HistoryTestCase{ + ID: id, + }) + return } func (g *gRPCLoader) DeleteAllHistoryTestCase(suite, name string) (err error) { - _, err = g.client.DeleteAllHistoryTestCase(g.ctx, &server.HistoryTestCase{ - SuiteName: suite, - CaseName: name, - }) - return + _, err = g.client.DeleteAllHistoryTestCase(g.ctx, &server.HistoryTestCase{ + SuiteName: suite, + CaseName: name, + }) + return } func (g *gRPCLoader) GetTestCaseAllHistory(suite, name string) (historyTestcases []testing.HistoryTestCase, err error) { - var historyTestCases *server.HistoryTestCases - historyTestCases, err = g.client.GetTestCaseAllHistory(g.ctx, &server.TestCase{ - Name: name, - SuiteName: suite, - }) - if err == nil && historyTestCases.Data != nil { - for _, item := range historyTestCases.Data { - historyTestcases = append(historyTestcases, ConvertToNormalHistoryTestCase(item)) - } - } - return + var historyTestCases *server.HistoryTestCases + historyTestCases, err = g.client.GetTestCaseAllHistory(g.ctx, &server.TestCase{ + Name: name, + SuiteName: suite, + }) + if err == nil && historyTestCases.Data != nil { + for _, item := range historyTestCases.Data { + historyTestcases = append(historyTestcases, ConvertToNormalHistoryTestCase(item)) + } + } + return } func (g *gRPCLoader) ListTestSuite() (suites []testing.TestSuite, err error) { - var items *TestSuites - items, err = g.client.ListTestSuite(g.ctx, &server.Empty{}) - if err == nil && items != nil { - for _, item := range items.Data { - suites = append(suites, *ConvertToNormalTestSuite(item)) - } - } - return + var items *TestSuites + items, err = g.client.ListTestSuite(g.ctx, &server.Empty{}) + if err == nil && items != nil { + for _, item := range items.Data { + suites = append(suites, *ConvertToNormalTestSuite(item)) + } + } + return } func (g *gRPCLoader) GetTestSuite(name string, full bool) (suite testing.TestSuite, err error) { - var result *TestSuite - if result, err = g.client.GetTestSuite(g.ctx, - &TestSuite{Name: name, Full: full}); err == nil { - suite = *ConvertToNormalTestSuite(result) - } - return + var result *TestSuite + if result, err = g.client.GetTestSuite(g.ctx, + &TestSuite{Name: name, Full: full}); err == nil { + suite = *ConvertToNormalTestSuite(result) + } + return } func (g *gRPCLoader) CreateSuite(name, api string) (err error) { - _, err = g.client.CreateTestSuite(g.ctx, &TestSuite{ - Name: name, - Api: api, - }) - return + _, err = g.client.CreateTestSuite(g.ctx, &TestSuite{ + Name: name, + Api: api, + }) + return } func (g *gRPCLoader) GetSuite(name string) (reply *testing.TestSuite, _ string, err error) { - var suite *TestSuite - if suite, err = g.client.GetTestSuite(g.ctx, - &TestSuite{Name: name}); err != nil { - return - } + var suite *TestSuite + if suite, err = g.client.GetTestSuite(g.ctx, + &TestSuite{Name: name}); err != nil { + return + } - reply = ConvertToNormalTestSuite(suite) - return + reply = ConvertToNormalTestSuite(suite) + return } func (g *gRPCLoader) UpdateSuite(suite testing.TestSuite) (err error) { - _, err = g.client.UpdateTestSuite(g.ctx, ConvertToGRPCTestSuite(&suite)) - return + _, err = g.client.UpdateTestSuite(g.ctx, ConvertToGRPCTestSuite(&suite)) + return } func (g *gRPCLoader) DeleteSuite(name string) (err error) { - _, err = g.client.DeleteTestSuite(g.ctx, &TestSuite{ - Name: name, - }) - return + _, err = g.client.DeleteTestSuite(g.ctx, &TestSuite{ + Name: name, + }) + return } func (g *gRPCLoader) RenameTestSuite(oldName, newName string) (err error) { - _, err = g.client.RenameTestSuite(g.ctx, &server.TestSuiteDuplicate{ - SourceSuiteName: oldName, - TargetSuiteName: newName, - }) - return + _, err = g.client.RenameTestSuite(g.ctx, &server.TestSuiteDuplicate{ + SourceSuiteName: oldName, + TargetSuiteName: newName, + }) + return } func (g *gRPCLoader) Verify() (readOnly bool, err error) { - // avoid to long to wait the response - ctx, cancel := context.WithTimeout(g.ctx, time.Second*5) - defer cancel() + // avoid to long to wait the response + ctx, cancel := context.WithTimeout(g.ctx, time.Second*5) + defer cancel() - var result *server.ExtensionStatus - if result, err = g.client.Verify(ctx, &server.Empty{}); err == nil { - readOnly = result.ReadOnly - if !result.Ready { - err = errors.New(result.Message) - } - } - return + var result *server.ExtensionStatus + if result, err = g.client.Verify(ctx, &server.Empty{}); err == nil { + readOnly = result.ReadOnly + if !result.Ready { + err = errors.New(result.Message) + } + } + return } func (g *gRPCLoader) PProf(name string) []byte { - data, err := g.client.PProf(context.Background(), &server.PProfRequest{ - Name: name, - }) - if err != nil { - grpcLogger.Info("failed to get pprof:", "error", err) - } - return data.Data + data, err := g.client.PProf(context.Background(), &server.PProfRequest{ + Name: name, + }) + if err != nil { + grpcLogger.Info("failed to get pprof:", "error", err) + } + return data.Data } -func (g *gRPCLoader) Query(query map[string]string) (result map[string]string, items []map[string]string, err error) { - var dataResult *server.DataQueryResult - if dataResult, err = g.client.Query(g.ctx, &server.DataQuery{ - Sql: query["sql"], - Key: query["key"], - }); err == nil { - result = pairToMap(dataResult.Data) - for _, item := range dataResult.Items { - items = append(items, pairToMap(item.Data)) - } - } - return +func (g *gRPCLoader) Query(query map[string]string) (result testing.DataResult, err error) { + var dataResult *server.DataQueryResult + if dataResult, err = g.client.Query(g.ctx, &server.DataQuery{ + Sql: query["sql"], + Key: query["key"], + }); err == nil { + result.Pairs = pairToMap(dataResult.Data) + for _, item := range dataResult.Items { + result.Rows = append(result.Rows, pairToMap(item.Data)) + } + result.Databases = dataResult.Meta.Databases + result.Tables = dataResult.Meta.Tables + result.CurrentDatabase = dataResult.Meta.CurrentDatabase + } + return } func (g *gRPCLoader) Close() { - if g.conn != nil { - g.conn.Close() - } + if g.conn != nil { + g.conn.Close() + } } diff --git a/pkg/testing/remote/loader.pb.go b/pkg/testing/remote/loader.pb.go index a4a4e28..9b556f3 100644 --- a/pkg/testing/remote/loader.pb.go +++ b/pkg/testing/remote/loader.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v4.25.1 +// protoc v4.22.2 // source: pkg/testing/remote/loader.proto package remote diff --git a/pkg/testing/remote/loader_grpc.pb.go b/pkg/testing/remote/loader_grpc.pb.go index 6f09f1b..49f77eb 100644 --- a/pkg/testing/remote/loader_grpc.pb.go +++ b/pkg/testing/remote/loader_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v4.25.1 +// - protoc v4.22.2 // source: pkg/testing/remote/loader.proto package remote