本文整理汇总了Golang中github.com/cloudfoundry/cli/testhelpers/api.NewCloudControllerTestRequest函数的典型用法代码示例。如果您正苦于以下问题:Golang NewCloudControllerTestRequest函数的具体用法?Golang NewCloudControllerTestRequest怎么用?Golang NewCloudControllerTestRequest使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewCloudControllerTestRequest函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: createUsersByRoleEndpoints
func createUsersByRoleEndpoints(rolePath string) (ccReqs []testnet.TestRequest, uaaReqs []testnet.TestRequest) {
nextUrl := rolePath + "?page=2"
ccReqs = []testnet.TestRequest{
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: rolePath,
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: fmt.Sprintf(`
{
"next_url": "%s",
"resources": [
{"metadata": {"guid": "user-1-guid"}, "entity": {}}
]
}`, nextUrl)}}),
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: nextUrl,
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: `
{
"resources": [
{"metadata": {"guid": "user-2-guid"}, "entity": {}},
{"metadata": {"guid": "user-3-guid"}, "entity": {}}
]
}`}}),
}
uaaReqs = []testnet.TestRequest{
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: fmt.Sprintf(
"/Users?attributes=id,userName&filter=%s",
url.QueryEscape(`Id eq "user-1-guid" or Id eq "user-2-guid" or Id eq "user-3-guid"`)),
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: `
{
"resources": [
{ "id": "user-1-guid", "userName": "Super user 1" },
{ "id": "user-2-guid", "userName": "Super user 2" },
{ "id": "user-3-guid", "userName": "Super user 3" }
]
}`}})}
return
}
开发者ID:palakmathur,项目名称:cli,代码行数:50,代码来源:users_test.go
示例2: deleteSharedDomainReq
func deleteSharedDomainReq(statusCode int) testnet.TestRequest {
return testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "DELETE",
Path: "/v2/shared_domains/my-domain-guid?recursive=true",
Response: testnet.TestResponse{Status: statusCode},
})
}
开发者ID:GABONIA,项目名称:cli,代码行数:7,代码来源:domains_test.go
示例3: testSpacesDidNotFindByNameWithOrg
func testSpacesDidNotFindByNameWithOrg(orgGuid string, findByName func(SpaceRepository, string) (models.Space, error)) {
request := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: fmt.Sprintf("/v2/organizations/%s/spaces?q=name%%3Aspace1&inline-relations-depth=1", orgGuid),
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: ` { "resources": [ ] }`,
},
})
ts, handler, repo := createSpacesRepo(request)
defer ts.Close()
_, apiErr := findByName(repo, "Space1")
Expect(handler).To(HaveAllRequestsCalled())
Expect(apiErr.(*errors.ModelNotFoundError)).NotTo(BeNil())
}
开发者ID:herchu,项目名称:cli,代码行数:18,代码来源:spaces_test.go
示例4: testSpacesFindByNameWithOrg
func testSpacesFindByNameWithOrg(orgGuid string, findByName func(SpaceRepository, string) (models.Space, error)) {
findSpaceByNameResponse := testnet.TestResponse{
Status: http.StatusOK,
Body: `
{
"resources": [
{
"metadata": {
"guid": "space1-guid"
},
"entity": {
"name": "Space1",
"organization_guid": "org1-guid",
"organization": {
"metadata": {
"guid": "org1-guid"
},
"entity": {
"name": "Org1"
}
},
"apps": [
{
"metadata": {
"guid": "app1-guid"
},
"entity": {
"name": "app1"
}
},
{
"metadata": {
"guid": "app2-guid"
},
"entity": {
"name": "app2"
}
}
],
"domains": [
{
"metadata": {
"guid": "domain1-guid"
},
"entity": {
"name": "domain1"
}
}
],
"service_instances": [
{
"metadata": {
"guid": "service1-guid"
},
"entity": {
"name": "service1"
}
}
]
}
}
]
}`}
request := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: fmt.Sprintf("/v2/organizations/%s/spaces?q=name%%3Aspace1&inline-relations-depth=1", orgGuid),
Response: findSpaceByNameResponse,
})
ts, handler, repo := createSpacesRepo(request)
defer ts.Close()
space, apiErr := findByName(repo, "Space1")
Expect(handler).To(HaveAllRequestsCalled())
Expect(apiErr).NotTo(HaveOccurred())
Expect(space.Name).To(Equal("Space1"))
Expect(space.Guid).To(Equal("space1-guid"))
Expect(space.Organization.Guid).To(Equal("org1-guid"))
Expect(len(space.Applications)).To(Equal(2))
Expect(space.Applications[0].Guid).To(Equal("app1-guid"))
Expect(space.Applications[1].Guid).To(Equal("app2-guid"))
Expect(len(space.Domains)).To(Equal(1))
Expect(space.Domains[0].Guid).To(Equal("domain1-guid"))
Expect(len(space.ServiceInstances)).To(Equal(1))
Expect(space.ServiceInstances[0].Guid).To(Equal("service1-guid"))
Expect(apiErr).NotTo(HaveOccurred())
return
}
开发者ID:herchu,项目名称:cli,代码行数:93,代码来源:spaces_test.go
示例5:
ts, handler = testnet.NewServer(requests)
config.SetApiEndpoint(ts.URL)
}
It("lists buildpacks", func() {
setupTestServer(
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/buildpacks",
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: `{
"next_url": "/v2/buildpacks?page=2",
"resources": [
{
"metadata": {
"guid": "buildpack1-guid"
},
"entity": {
"name": "Buildpack1",
"position" : 1,
"filename" : "firstbp.zip"
}
}
]
}`}}),
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/buildpacks?page=2",
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: `{
开发者ID:herchu,项目名称:cli,代码行数:32,代码来源:buildpacks_test.go
示例6:
)
var _ = Describe("Service Brokers Repo", func() {
It("lists services brokers", func() {
firstRequest := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/service_brokers",
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: `{
"next_url": "/v2/service_brokers?page=2",
"resources": [
{
"metadata": {
"guid":"found-guid-1"
},
"entity": {
"name": "found-name-1",
"broker_url": "http://found.example.com-1",
"auth_username": "found-username-1",
"auth_password": "found-password-1"
}
}
]
}`,
},
})
secondRequest := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/service_brokers?page=2",
开发者ID:herchu,项目名称:cli,代码行数:31,代码来源:service_brokers_test.go
示例7:
app, apiErr := repo.Read("My App")
Expect(handler).To(testnet.HaveAllRequestsCalled())
Expect(apiErr).NotTo(HaveOccurred())
Expect(app.Name).To(Equal("My App"))
Expect(app.Guid).To(Equal("app1-guid"))
Expect(app.Memory).To(Equal(uint64(128)))
Expect(app.DiskQuota).To(Equal(uint64(512)))
Expect(app.InstanceCount).To(Equal(1))
Expect(app.EnvironmentVars).To(Equal(map[string]string{"foo": "bar", "baz": "boom"}))
Expect(app.Routes[0].Host).To(Equal("app1"))
Expect(app.Routes[0].Domain.Name).To(Equal("cfapps.io"))
Expect(app.Stack.Name).To(Equal("awesome-stacks-ahoy"))
})
It("returns a failure response when the app is not found", func() {
request := testapi.NewCloudControllerTestRequest(findAppRequest)
request.Response = testnet.TestResponse{Status: http.StatusOK, Body: `{"resources": []}`}
ts, handler, repo := createAppRepo([]testnet.TestRequest{request})
defer ts.Close()
_, apiErr := repo.Read("My App")
Expect(handler).To(testnet.HaveAllRequestsCalled())
Expect(apiErr.(*errors.ModelNotFoundError)).NotTo(BeNil())
})
})
Describe("creating applications", func() {
It("makes the right request", func() {
ts, handler, repo := createAppRepo([]testnet.TestRequest{createApplicationRequest})
defer ts.Close()
开发者ID:GABONIA,项目名称:cli,代码行数:31,代码来源:applications_test.go
示例8:
configRepo.SetAccessToken("BEARER my_access_token")
gateway := net.NewCloudControllerGateway((configRepo), time.Now)
repo = NewCloudControllerServiceRepository(configRepo, gateway)
})
AfterEach(func() {
testServer.Close()
})
Describe("GetAllServiceOfferings", func() {
BeforeEach(func() {
setupTestServer(
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/services?inline-relations-depth=1",
Response: firstOfferingsResponse,
}),
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/services?inline-relations-depth=1",
Response: multipleOfferingsResponse,
}),
)
})
It("gets all public service offerings", func() {
offerings, err := repo.GetAllServiceOfferings()
Expect(testHandler).To(testnet.HaveAllRequestsCalled())
Expect(err).NotTo(HaveOccurred())
开发者ID:GABONIA,项目名称:cli,代码行数:31,代码来源:services_test.go
示例9:
"github.com/cloudfoundry/cli/cf/models"
"github.com/cloudfoundry/cli/cf/net"
testapi "github.com/cloudfoundry/cli/testhelpers/api"
testconfig "github.com/cloudfoundry/cli/testhelpers/configuration"
testnet "github.com/cloudfoundry/cli/testhelpers/net"
. "github.com/cloudfoundry/cli/cf/api"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("UserProvidedServiceRepository", func() {
It("creates a user provided service with a name and credentials", func() {
req := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "POST",
Path: "/v2/user_provided_service_instances",
Matcher: testnet.RequestBodyMatcher(`{"name":"my-custom-service","credentials":{"host":"example.com","password":"secret","user":"me"},"space_guid":"my-space-guid","syslog_drain_url":""}`),
Response: testnet.TestResponse{Status: http.StatusCreated},
})
ts, handler, repo := createUserProvidedServiceInstanceRepo(req)
defer ts.Close()
apiErr := repo.Create("my-custom-service", "", map[string]string{
"host": "example.com",
"user": "me",
"password": "secret",
})
Expect(handler).To(testnet.HaveAllRequestsCalled())
Expect(apiErr).NotTo(HaveOccurred())
})
开发者ID:GABONIA,项目名称:cli,代码行数:31,代码来源:user_provided_service_instances_test.go
示例10:
. "github.com/cloudfoundry/cli/cf/api"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Organization Repository", func() {
Describe("listing organizations", func() {
It("lists the orgs from the the /v2/orgs endpoint", func() {
firstPageOrgsRequest := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/organizations",
Response: testnet.TestResponse{Status: http.StatusOK, Body: `{
"next_url": "/v2/organizations?page=2",
"resources": [
{
"metadata": { "guid": "org1-guid" },
"entity": { "name": "Org1" }
},
{
"metadata": { "guid": "org2-guid" },
"entity": { "name": "Org2" }
}
]}`},
})
secondPageOrgsRequest := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/organizations?page=2",
Response: testnet.TestResponse{Status: http.StatusOK, Body: `{"resources": [
{
"metadata": { "guid": "org3-guid" },
"entity": { "name": "Org3" }
开发者ID:GABONIA,项目名称:cli,代码行数:32,代码来源:organizations_test.go
示例11:
writer.WriteHeader(http.StatusInternalServerError)
return
}
writer.WriteHeader(http.StatusOK)
fmt.Fprint(writer, expectedResponse)
}
listFilesServer := httptest.NewServer(http.HandlerFunc(listFilesEndpoint))
defer listFilesServer.Close()
req := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/apps/my-app-guid/instances/0/files/some/path",
Response: testnet.TestResponse{
Status: http.StatusTemporaryRedirect,
Header: http.Header{
"Location": {fmt.Sprintf("%s/some/path", listFilesServer.URL)},
},
},
})
listFilesRedirectServer, handler := testnet.NewServer([]testnet.TestRequest{req})
defer listFilesRedirectServer.Close()
configRepo := testconfig.NewRepositoryWithDefaults()
configRepo.SetApiEndpoint(listFilesRedirectServer.URL)
gateway := net.NewCloudControllerGateway(configRepo, time.Now)
repo := NewCloudControllerAppFilesRepository(configRepo, gateway)
list, err := repo.ListFiles("my-app-guid", "some/path")
开发者ID:resouer,项目名称:cli,代码行数:31,代码来源:app_files_test.go
示例12:
Expect(reportedFilePath).To(Equal(appPath))
Expect(reportedFileCount).To(Equal(uint64(len(expectedApplicationContent))))
Expect(reportedUploadSize).To(Equal(uint64(532)))
})
It("returns a failure when uploading bits fails", func() {
apiErr := testUploadApp(appPath, []testnet.TestRequest{
matchResourceRequest,
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "PUT",
Path: "/v2/apps/my-cool-app-guid/bits",
Matcher: uploadBodyMatcher,
Response: testnet.TestResponse{
Status: http.StatusCreated,
Body: `
{
"metadata":{
"guid": "my-job-guid",
"url": "/v2/jobs/my-job-guid"
}
}`,
}}),
createProgressEndpoint("running"),
createProgressEndpoint("failed"),
}...)
Expect(apiErr).To(HaveOccurred())
})
Context("when there are no files to upload", func() {
It("makes a request without a zipfile", func() {
开发者ID:GABONIA,项目名称:cli,代码行数:31,代码来源:application_bits_test.go
示例13: createPasswordRepo
"github.com/cloudfoundry/cli/cf/net"
testapi "github.com/cloudfoundry/cli/testhelpers/api"
testconfig "github.com/cloudfoundry/cli/testhelpers/configuration"
testnet "github.com/cloudfoundry/cli/testhelpers/net"
. "github.com/cloudfoundry/cli/cf/api"
. "github.com/cloudfoundry/cli/testhelpers/matchers"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("CloudControllerPasswordRepository", func() {
It("updates your password", func() {
req := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "PUT",
Path: "/Users/my-user-guid/password",
Matcher: testnet.RequestBodyMatcher(`{"password":"new-password","oldPassword":"old-password"}`),
Response: testnet.TestResponse{Status: http.StatusOK},
})
passwordUpdateServer, handler, repo := createPasswordRepo(req)
defer passwordUpdateServer.Close()
apiErr := repo.UpdatePassword("old-password", "new-password")
Expect(handler).To(HaveAllRequestsCalled())
Expect(apiErr).NotTo(HaveOccurred())
})
})
func createPasswordRepo(req testnet.TestRequest) (passwordServer *httptest.Server, handler *testnet.TestHandler, repo PasswordRepository) {
passwordServer, handler = testnet.NewServer([]testnet.TestRequest{req})
开发者ID:herchu,项目名称:cli,代码行数:31,代码来源:password_test.go
示例14:
testServer.Close()
})
setupTestServer := func(reqs ...testnet.TestRequest) {
testServer, testHandler = testnet.NewServer(reqs)
configRepo.SetApiEndpoint(testServer.URL)
}
Describe(".Create", func() {
It("can create an app security group, given some attributes", func() {
req := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "POST",
Path: "/v2/security_groups",
// FIXME: this matcher depend on the order of the key/value pairs in the map
Matcher: testnet.RequestBodyMatcher(`{
"name": "mygroup",
"rules": [{"my-house": "my-rules"}],
"space_guids": ["myspace"]
}`),
Response: testnet.TestResponse{Status: http.StatusCreated},
})
setupTestServer(req)
err := repo.Create(
"mygroup",
[]map[string]string{{"my-house": "my-rules"}},
[]string{"myspace"},
)
Expect(err).NotTo(HaveOccurred())
Expect(testHandler).To(HaveAllRequestsCalled())
开发者ID:herchu,项目名称:cli,代码行数:31,代码来源:security_group_test.go
示例15:
BeforeEach(func() {
configRepo = testconfig.NewRepositoryWithDefaults()
gateway := net.NewCloudControllerGateway((configRepo), time.Now)
repo = NewCloudControllerServiceAuthTokenRepository(configRepo, gateway)
})
AfterEach(func() {
testServer.Close()
})
Describe("Create", func() {
It("creates a service auth token", func() {
setupTestServer(testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "POST",
Path: "/v2/service_auth_tokens",
Matcher: testnet.RequestBodyMatcher(`{"label":"a label","provider":"a provider","token":"a token"}`),
Response: testnet.TestResponse{Status: http.StatusCreated},
}))
err := repo.Create(models.ServiceAuthTokenFields{
Label: "a label",
Provider: "a provider",
Token: "a token",
})
Expect(testHandler).To(testnet.HaveAllRequestsCalled())
Expect(err).NotTo(HaveOccurred())
})
})
Describe("FindAll", func() {
开发者ID:palakmathur,项目名称:cli,代码行数:32,代码来源:service_auth_tokens_test.go
示例16:
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("AppSummaryRepository", func() {
var (
testServer *httptest.Server
handler *testnet.TestHandler
repo AppSummaryRepository
)
BeforeEach(func() {
getAppSummariesRequest := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/spaces/my-space-guid/summary",
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: getAppSummariesResponseBody,
},
})
testServer, handler = testnet.NewServer([]testnet.TestRequest{getAppSummariesRequest})
configRepo := testconfig.NewRepositoryWithDefaults()
configRepo.SetApiEndpoint(testServer.URL)
gateway := net.NewCloudControllerGateway(configRepo, time.Now)
repo = NewCloudControllerAppSummaryRepository(configRepo, gateway)
})
AfterEach(func() {
testServer.Close()
})
开发者ID:herchu,项目名称:cli,代码行数:31,代码来源:app_summary_test.go
示例17:
Expect(testHandler).To(testnet.HaveAllRequestsCalled())
Expect(err).NotTo(HaveOccurred())
Expect(stack).To(Equal(models.Stack{
Name: "custom-linux",
Guid: "custom-linux-guid",
}))
})
})
Context("when a stack does not exist", func() {
BeforeEach(func() {
setupTestServer(testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/stacks?q=name%3Alinux",
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: ` { "resources": []}`,
}}))
})
It("returns an error", func() {
_, err := repo.FindByName("linux")
Expect(testHandler).To(testnet.HaveAllRequestsCalled())
Expect(err).To(BeAssignableToTypeOf(&errors.ModelNotFoundError{}))
})
})
})
Describe("FindAll", func() {
开发者ID:GABONIA,项目名称:cli,代码行数:30,代码来源:stacks_test.go
示例18:
AfterEach(func() {
testServer.Close()
})
setupTestServer := func(reqs ...testnet.TestRequest) {
testServer, testHandler = testnet.NewServer(reqs)
configRepo.SetApiEndpoint(testServer.URL)
}
Describe("AddToDefaultStagingSet", func() {
It("makes a correct request", func() {
setupTestServer(
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "PUT",
Path: "/v2/config/staging_security_groups/a-real-guid",
Response: testnet.TestResponse{
Status: http.StatusCreated,
Body: addStagingResponse,
},
}),
)
err := repo.AddToDefaultStagingSet("a-real-guid")
Expect(err).ToNot(HaveOccurred())
Expect(testHandler).To(HaveAllRequestsCalled())
})
})
Describe(".List", func() {
It("returns a list of security groups that are the defaults for staging", func() {
setupTestServer(
开发者ID:herchu,项目名称:cli,代码行数:32,代码来源:staging_security_group_repo_test.go
示例19:
Name: "the-space-name",
})
gateway := net.NewCloudControllerGateway((configRepo), time.Now)
repo = NewCloudControllerRouteRepository(configRepo, gateway)
})
AfterEach(func() {
ts.Close()
})
Describe("List routes", func() {
It("lists routes in the current space", func() {
ts, handler = testnet.NewServer([]testnet.TestRequest{
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/spaces/the-space-guid/routes?inline-relations-depth=1",
Response: firstPageRoutesResponse,
}),
testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/spaces/the-space-guid/routes?inline-relations-depth=1&page=2",
Response: secondPageRoutesResponse,
}),
})
configRepo.SetApiEndpoint(ts.URL)
routes := []models.Route{}
apiErr := repo.ListRoutes(func(route models.Route) bool {
routes = append(routes, route)
return true
})
开发者ID:GABONIA,项目名称:cli,代码行数:31,代码来源:routes_test.go
示例20: newCurlDependencies
gateway net.Gateway
}
func newCurlDependencies() (deps curlDependencies) {
deps.config = testconfig.NewRepository()
deps.config.SetAccessToken("BEARER my_access_token")
deps.gateway = net.NewCloudControllerGateway(deps.config, time.Now)
return
}
var _ = Describe("curl command", func() {
It("TestCurlGetRequest", func() {
req := testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "GET",
Path: "/v2/endpoint",
Response: testnet.TestResponse{
Status: http.StatusOK,
Body: expectedJSONResponse},
})
ts, handler := testnet.NewServer([]testnet.TestRequest{req})
defer ts.Close()
deps := newCurlDependencies()
deps.config.SetApiEndpoint(ts.URL)
repo := NewCloudControllerCurlRepository(deps.config, deps.gateway)
headers, body, apiErr := repo.Request("GET", "/v2/endpoint", "", "")
Expect(handler).To(testnet.HaveAllRequestsCalled())
Expect(headers).To(ContainSubstring("200"))
Expect(headers).To(ContainSubstring("Content-Type"))
开发者ID:palakmathur,项目名称:cli,代码行数:31,代码来源:curl_test.go
注:本文中的github.com/cloudfoundry/cli/testhelpers/api.NewCloudControllerTestRequest函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论