674 lines
14 KiB
Protocol Buffer
674 lines
14 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
option go_package = "github.com/linuxsuren/api-testing/pkg/server";
|
|
|
|
package server;
|
|
|
|
import "google/protobuf/timestamp.proto";
|
|
|
|
import "google/api/annotations.proto";
|
|
|
|
service Runner {
|
|
// belong to a specific store
|
|
rpc Run (TestTask) returns (TestResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/run"
|
|
body: "*"
|
|
};
|
|
}
|
|
|
|
rpc RunTestSuite(stream TestSuiteIdentity) returns (stream TestResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/run/suite"
|
|
body: "*"
|
|
};
|
|
}
|
|
// test suites related
|
|
rpc GetSuites(Empty) returns (Suites) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/suites"
|
|
};
|
|
}
|
|
rpc CreateTestSuite(TestSuiteIdentity) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc ImportTestSuite(TestSuiteSource) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/import"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc GetTestSuite(TestSuiteIdentity) returns (TestSuite) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/suites/{name}"
|
|
};
|
|
}
|
|
rpc UpdateTestSuite(TestSuite) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
put: "/api/v1/suites/{name}"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc DeleteTestSuite(TestSuiteIdentity) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
delete: "/api/v1/suites/{name}"
|
|
};
|
|
}
|
|
rpc DuplicateTestSuite(TestSuiteDuplicate) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{sourceSuiteName}/duplicate"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc RenameTestSuite(TestSuiteDuplicate) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{sourceSuiteName}/rename"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc GetTestSuiteYaml(TestSuiteIdentity) returns (YamlData) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/suites/{name}/yaml"
|
|
};
|
|
}
|
|
|
|
// test cases related
|
|
rpc ListTestCase(TestSuiteIdentity) returns (Suite) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/suites/{name}/cases"
|
|
};
|
|
}
|
|
// run target test case of a specific test suite
|
|
rpc RunTestCase(TestCaseIdentity) returns (TestCaseResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{suite}/cases/{testcase}/run"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc BatchRun (stream BatchTestTask) returns (stream TestResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/batchRun"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc GetTestCase(TestCaseIdentity) returns (TestCase) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/suites/{suite}/cases/{testcase}"
|
|
};
|
|
}
|
|
rpc CreateTestCase(TestCaseWithSuite) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{suiteName}/cases"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc UpdateTestCase(TestCaseWithSuite) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
put: "/api/v1/suites/{suiteName}/cases/{data.name}"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc DeleteTestCase(TestCaseIdentity) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
delete: "/api/v1/suites/{suite}/cases/{testcase}"
|
|
};
|
|
}
|
|
rpc DuplicateTestCase(TestCaseDuplicate) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{sourceSuiteName}/cases/{sourceCaseName}/duplicate"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc RenameTestCase(TestCaseDuplicate) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{sourceSuiteName}/cases/{sourceCaseName}/rename"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc GetSuggestedAPIs(TestSuiteIdentity) returns (TestCases) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/suggestedAPIs"
|
|
};
|
|
}
|
|
|
|
// history test related
|
|
rpc GetHistorySuites(Empty) returns (HistorySuites) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/historySuites"
|
|
};
|
|
}
|
|
|
|
rpc GetHistoryTestCaseWithResult(HistoryTestCase) returns (HistoryTestResult) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/historyTestCaseWithResult/{ID}"
|
|
};
|
|
}
|
|
|
|
rpc GetHistoryTestCase(HistoryTestCase) returns (HistoryTestCase) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/historyTestCase/{ID}"
|
|
};
|
|
}
|
|
|
|
rpc DeleteHistoryTestCase(HistoryTestCase) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
delete: "/api/v1/historyTestCase/{ID}"
|
|
};
|
|
}
|
|
|
|
rpc DeleteAllHistoryTestCase(HistoryTestCase) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
delete: "/api/v1/historySuites/{suiteName}/cases/{caseName}"
|
|
};
|
|
}
|
|
|
|
rpc GetTestCaseAllHistory(TestCase) returns (HistoryTestCases) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/suites/{suiteName}/cases/{name}"
|
|
};
|
|
}
|
|
|
|
// code generator
|
|
rpc ListCodeGenerator(Empty) returns (SimpleList) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/codeGenerators"
|
|
};
|
|
}
|
|
rpc GenerateCode(CodeGenerateRequest) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/codeGenerators/generate"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc HistoryGenerateCode(CodeGenerateRequest) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/codeGenerators/history/generate"
|
|
body: "*"
|
|
};
|
|
}
|
|
|
|
// converter
|
|
rpc ListConverter(Empty) returns (SimpleList) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/converters"
|
|
};
|
|
}
|
|
rpc ConvertTestSuite(CodeGenerateRequest) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/converters/convert"
|
|
body: "*"
|
|
};
|
|
}
|
|
|
|
// common services
|
|
rpc PopularHeaders(Empty) returns (Pairs) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/popularHeaders"
|
|
};
|
|
}
|
|
rpc FunctionsQuery(SimpleQuery) returns (Pairs) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/functions"
|
|
};
|
|
}
|
|
rpc FunctionsQueryStream(stream SimpleQuery) returns (stream Pairs) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/functionsQuery"
|
|
};
|
|
}
|
|
rpc GetVersion(Empty) returns (Version) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/version"
|
|
};
|
|
}
|
|
rpc Sample(Empty) returns (HelloReply) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/sample"
|
|
};
|
|
}
|
|
|
|
rpc DownloadResponseFile(TestCase) returns (FileData) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/downloadFile/{response.body}"
|
|
body: "*"
|
|
};
|
|
}
|
|
// stores related interfaces
|
|
rpc GetStoreKinds(Empty) returns (StoreKinds) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/stores/kinds"
|
|
};
|
|
}
|
|
rpc GetStores(Empty) returns (Stores) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/stores"
|
|
};
|
|
}
|
|
rpc CreateStore(Store) returns (Store) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/stores"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc UpdateStore(Store) returns (Store) {
|
|
option (google.api.http) = {
|
|
put: "/api/v1/stores/{name}"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc DeleteStore(Store) returns (Store) {
|
|
option (google.api.http) = {
|
|
delete: "/api/v1/stores/{name}"
|
|
};
|
|
}
|
|
rpc VerifyStore(SimpleQuery) returns (ExtensionStatus) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/stores/verify"
|
|
body: "*"
|
|
};
|
|
}
|
|
|
|
// secret related interfaces
|
|
rpc GetSecrets(Empty) returns (Secrets) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/secrets"
|
|
};
|
|
}
|
|
rpc CreateSecret(Secret) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/secrets"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc DeleteSecret(Secret) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
delete: "/api/v1/secrets/{Name}"
|
|
};
|
|
}
|
|
rpc UpdateSecret(Secret) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
put: "/api/v1/secrets/{Name}"
|
|
body: "*"
|
|
};
|
|
}
|
|
|
|
// extension
|
|
rpc PProf(PProfRequest) returns (PProfData) {}
|
|
}
|
|
|
|
service RunnerExtension {
|
|
rpc Run(TestSuiteWithCase) returns (CommonResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/extension/run"
|
|
body: "*"
|
|
};
|
|
}
|
|
}
|
|
|
|
message Suites {
|
|
map<string, Items> data = 1;
|
|
}
|
|
|
|
message Items {
|
|
repeated string data = 1;
|
|
string kind = 2;
|
|
}
|
|
|
|
message HistorySuites {
|
|
map<string, HistoryItems> data = 1;
|
|
}
|
|
|
|
message HistoryItems {
|
|
repeated HistoryCaseIdentity data = 1;
|
|
}
|
|
|
|
message HistoryCaseIdentity {
|
|
string suite = 1;
|
|
string testcase = 2;
|
|
string historySuiteName = 3;
|
|
string kind = 4;
|
|
string ID = 5;
|
|
}
|
|
|
|
message TestCaseIdentity {
|
|
string suite = 1;
|
|
string testcase = 2;
|
|
repeated Pair parameters = 3;
|
|
|
|
}
|
|
|
|
message TestSuiteSource {
|
|
string kind = 1;
|
|
string url = 2;
|
|
string data = 3;
|
|
}
|
|
|
|
message TestSuite {
|
|
string name = 1;
|
|
string api = 2;
|
|
repeated Pair param = 3;
|
|
APISpec spec = 4;
|
|
ProxyConfig proxy = 5;
|
|
}
|
|
|
|
message TestSuiteWithCase {
|
|
TestSuite suite = 1;
|
|
TestCase case = 2;
|
|
}
|
|
|
|
message APISpec {
|
|
string kind = 1;
|
|
string url = 2;
|
|
RPC rpc = 3;
|
|
Secure secure = 4;
|
|
}
|
|
|
|
message Secure {
|
|
bool insecure = 1;
|
|
string cert = 2;
|
|
string ca = 3;
|
|
string serverName = 4;
|
|
string key = 5;
|
|
}
|
|
|
|
message RPC{
|
|
repeated string import = 1;
|
|
bool serverReflection = 2;
|
|
string protofile = 3;
|
|
string protoset = 4;
|
|
string raw = 5;
|
|
}
|
|
|
|
message TestSuiteIdentity {
|
|
string name = 1;
|
|
string api = 2;
|
|
string kind = 3;
|
|
}
|
|
|
|
message TestSuiteDuplicate {
|
|
string sourceSuiteName = 1;
|
|
string targetSuiteName = 2;
|
|
}
|
|
|
|
message TestCaseDuplicate {
|
|
string sourceSuiteName = 1;
|
|
string sourceCaseName = 2;
|
|
string targetSuiteName = 3;
|
|
string targetCaseName = 4;
|
|
}
|
|
|
|
message TestTask {
|
|
string data = 1;
|
|
string kind = 2;
|
|
string caseName = 3;
|
|
string level = 4;
|
|
map<string, string> env = 5;
|
|
repeated Pair parameters = 6;
|
|
}
|
|
|
|
message BatchTestTask {
|
|
string suiteName = 1;
|
|
string caseName = 2;
|
|
repeated Pair parameters = 3;
|
|
int32 count = 4;
|
|
string interval = 5;
|
|
}
|
|
|
|
message TestResult {
|
|
string message = 1;
|
|
string error = 2;
|
|
repeated TestCaseResult testCaseResult = 3;
|
|
}
|
|
|
|
message HistoryTestResult {
|
|
string message = 1;
|
|
string error = 2;
|
|
repeated TestCaseResult testCaseResult = 3;
|
|
HistoryTestCase data = 4;
|
|
google.protobuf.Timestamp createTime = 5;
|
|
}
|
|
|
|
|
|
message HelloReply {
|
|
string message = 1;
|
|
string error = 2;
|
|
}
|
|
|
|
message YamlData {
|
|
bytes data = 1;
|
|
}
|
|
|
|
message Suite {
|
|
string name = 1;
|
|
string api = 2;
|
|
repeated TestCase items = 3;
|
|
}
|
|
|
|
message TestCaseWithSuite {
|
|
string suiteName = 1;
|
|
TestCase data = 2;
|
|
}
|
|
|
|
message TestCases {
|
|
repeated TestCase data = 1;
|
|
}
|
|
|
|
message TestCase {
|
|
string name = 1;
|
|
string suiteName = 2;
|
|
Request request = 3;
|
|
Response response = 4;
|
|
string server = 5;
|
|
}
|
|
|
|
message HistoryTestCase {
|
|
string caseName = 1;
|
|
string suiteName = 2;
|
|
string historySuiteName = 3;
|
|
google.protobuf.Timestamp createTime = 4;
|
|
repeated Pair suiteParam = 5;
|
|
APISpec suiteSpec = 6;
|
|
string suiteApi = 7;
|
|
Request request = 8;
|
|
Response response = 9;
|
|
string ID = 10;
|
|
repeated Pair historyHeader = 11;
|
|
}
|
|
|
|
message HistoryTestCases{
|
|
repeated HistoryTestCase data = 1;
|
|
}
|
|
|
|
message Request {
|
|
string api = 1;
|
|
string method = 2;
|
|
repeated Pair header = 3;
|
|
repeated Pair query = 4;
|
|
repeated Pair cookie = 5;
|
|
repeated Pair form = 6;
|
|
string body = 7;
|
|
}
|
|
|
|
message Response {
|
|
int32 statusCode = 1;
|
|
string body = 2;
|
|
repeated Pair header = 3;
|
|
repeated Pair bodyFieldsExpect = 4;
|
|
repeated string verify = 5;
|
|
repeated ConditionalVerify ConditionalVerify = 6;
|
|
string schema = 7;
|
|
}
|
|
|
|
message ConditionalVerify {
|
|
repeated string condition = 1;
|
|
repeated string verify = 2;
|
|
}
|
|
|
|
message TestCaseResult {
|
|
int32 statusCode = 1;
|
|
string body = 2;
|
|
repeated Pair header = 3;
|
|
string error = 4;
|
|
string id = 5;
|
|
string output = 6;
|
|
}
|
|
|
|
message Pair {
|
|
string key = 1;
|
|
string value = 2;
|
|
string description = 3;
|
|
}
|
|
|
|
message Pairs {
|
|
repeated Pair data = 1;
|
|
}
|
|
|
|
message SimpleQuery {
|
|
string name = 1;
|
|
string kind = 2;
|
|
}
|
|
|
|
message Stores {
|
|
repeated Store data = 1;
|
|
}
|
|
|
|
message Store {
|
|
string name = 1;
|
|
string owner = 2;
|
|
string description = 3;
|
|
string url = 4;
|
|
string username = 5;
|
|
string password = 6;
|
|
repeated Pair properties = 7;
|
|
StoreKind kind = 8;
|
|
bool ready = 9;
|
|
bool readOnly = 10;
|
|
bool disabled = 11;
|
|
}
|
|
|
|
message StoreKinds {
|
|
repeated StoreKind data = 1;
|
|
}
|
|
|
|
message StoreKind {
|
|
string name = 1;
|
|
string url = 2;
|
|
bool enabled = 3;
|
|
}
|
|
|
|
message CommonResult {
|
|
bool success = 1;
|
|
string message = 2;
|
|
}
|
|
|
|
message SimpleList {
|
|
repeated Pair data = 1;
|
|
}
|
|
|
|
message SimpleName {
|
|
string name = 1;
|
|
}
|
|
|
|
message CodeGenerateRequest {
|
|
string TestSuite = 1;
|
|
string TestCase = 2;
|
|
string Generator = 3;
|
|
string ID = 4;
|
|
}
|
|
|
|
message Secrets {
|
|
repeated Secret data = 1;
|
|
}
|
|
|
|
message Secret {
|
|
string Name = 1;
|
|
string Value = 2;
|
|
string Description = 3;
|
|
}
|
|
|
|
message ExtensionStatus {
|
|
bool ready = 1;
|
|
bool readOnly = 2;
|
|
string version = 3;
|
|
string message = 4;
|
|
}
|
|
|
|
message PProfRequest {
|
|
string name = 1;
|
|
}
|
|
|
|
message PProfData {
|
|
bytes data = 1;
|
|
}
|
|
|
|
message FileData {
|
|
bytes data = 1;
|
|
string content_type = 2;
|
|
string filename = 3;
|
|
}
|
|
|
|
message Empty {
|
|
}
|
|
|
|
service Mock {
|
|
rpc Reload(MockConfig) returns (Empty) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/mock/reload"
|
|
body: "*"
|
|
};
|
|
}
|
|
rpc GetConfig(Empty) returns (MockConfig) {
|
|
option (google.api.http) = {
|
|
get: "/api/v1/mock/config"
|
|
};
|
|
}
|
|
}
|
|
|
|
message MockConfig {
|
|
string Prefix = 1;
|
|
string Config = 2;
|
|
int32 Port = 3;
|
|
}
|
|
|
|
message Version {
|
|
string version = 1;
|
|
string commit = 2;
|
|
string date = 3;
|
|
}
|
|
|
|
message ProxyConfig {
|
|
string http = 1; // HTTP proxy URL
|
|
string https = 2; // HTTPS proxy URL
|
|
string no = 3; // Comma-separated list of hosts to exclude from proxying
|
|
}
|
|
|
|
service DataServer {
|
|
rpc Query(DataQuery) returns (DataQueryResult) {
|
|
option (google.api.http) = {
|
|
post: "/api/v1/data/query"
|
|
body: "*"
|
|
};
|
|
}
|
|
}
|
|
|
|
message DataQuery {
|
|
string type = 1;
|
|
string key = 2;
|
|
string sql = 3;
|
|
}
|
|
|
|
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;
|
|
}
|