api-testing/pkg/server/server.proto

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;
}