blob: dc03b666b160fbc13ddc4145d3aeec1dfb71df85 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.servicecomb.demo.pojo.client;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import javax.inject.Inject;
import org.apache.servicecomb.demo.CategorizedTestCase;
import org.apache.servicecomb.demo.CodeFirstPojoIntf;
import org.apache.servicecomb.demo.TestMgr;
import org.apache.servicecomb.demo.compute.Person;
import org.apache.servicecomb.demo.server.User;
import org.apache.servicecomb.foundation.vertx.VertxUtils;
import org.apache.servicecomb.provider.pojo.RpcReference;
import org.apache.servicecomb.swagger.invocation.context.ContextUtils;
import org.apache.servicecomb.swagger.invocation.context.InvocationContext;
import org.springframework.stereotype.Component;
import io.vertx.core.Vertx;
@Component
public class CodeFirstPojoClient implements CategorizedTestCase {
@RpcReference(microserviceName = "pojo", schemaId = "org.apache.servicecomb.demo.CodeFirstPojoIntf")
public CodeFirstPojoClientIntf codeFirstAnnotation;
@RpcReference(microserviceName = "pojo")
public CodeFirstPojoIntf codeFirstAnnotationEmptySchemaId;
@Inject
private CodeFirstPojoIntf codeFirstFromXml;
@Override
public void testRestTransport() throws Exception {
testOnlyRest(codeFirstAnnotation);
}
@Override
public void testAllTransport() throws Exception {
testAll(codeFirstAnnotation);
testAll(codeFirstAnnotationEmptySchemaId);
testAll(codeFirstFromXml);
}
private void testOnlyRest(CodeFirstPojoIntf codeFirst) {
testCodeFirstStrings(codeFirst);
}
private void testAll(CodeFirstPojoIntf codeFirst) {
remoteCodeFirstPojo_testMap(codeFirst);
testCodeFirstUserMap(codeFirst);
testCodeFirstUserArray(codeFirst);
testCodeFirstStrings(codeFirst);
testCodeFirstBytes(codeFirst);
testCodeFirstAddDate(codeFirst);
testCodeFirstAddString(codeFirst);
testCodeFirstIsTrue(codeFirst);
testCodeFirstSayHi2(codeFirst);
testCodeFirstSayHi(codeFirst);
testCodeFirstSaySomething(codeFirst);
// testCodeFirstRawJsonString(template, cseUrlPrefix);
testCodeFirstSayHello(codeFirst);
testCodeFirstReduce(codeFirst);
testCodeFirstCompletableFuture(codeFirst);
}
private void testCodeFirstCompletableFuture(CodeFirstPojoIntf codeFirst) {
if (!CodeFirstPojoClientIntf.class.isInstance(codeFirst)) {
return;
}
Vertx vertx = VertxUtils.getOrCreateVertxByName("transport", null);
CountDownLatch latch = new CountDownLatch(1);
// vertx.runOnContext in normal thread is not a good practice
// here just a test, not care for this.
vertx.runOnContext(V -> {
InvocationContext context = new InvocationContext();
context.addContext("k", "v");
ContextUtils.setInvocationContext(context);
((CodeFirstPojoClientIntf) codeFirst).sayHiAsync("someone")
.thenCompose(result -> {
TestMgr.check("someone sayhi, context k: v", result);
TestMgr.check(true, context == ContextUtils.getInvocationContext());
return ((CodeFirstPojoClientIntf) codeFirst).sayHiAsync("someone 1");
})
.whenComplete((r, e) -> {
TestMgr.check("someone 1 sayhi, context k: v", r);
latch.countDown();
});
ContextUtils.removeInvocationContext();
});
try {
latch.await();
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}
private void remoteCodeFirstPojo_testMap(CodeFirstPojoIntf codeFirst) {
Map<String, String> userMap = new HashMap<>();
userMap.put("u1", "u1");
userMap.put("u2", null);
Map<String, String> result = codeFirst.testMap(userMap);
TestMgr.check(result.get("u1"), "u1");
TestMgr.check(result.get("u2"), null);
userMap = new HashMap<>();
userMap.put("u1", "u1");
userMap.put("u2", "u2");
result = codeFirst.testMap(userMap);
TestMgr.check(result.get("u1"), "u1");
TestMgr.check(result.get("u2"), "u2");
}
private void testCodeFirstUserMap(CodeFirstPojoIntf codeFirst) {
User user1 = new User();
user1.setNames(new String[] {"u1", "u2"});
User user2 = new User();
user2.setNames(new String[] {"u3", "u4"});
Map<String, User> userMap = new HashMap<>();
userMap.put("u1", user1);
userMap.put("u2", user2);
Map<String, User> result = codeFirst.testUserMap(userMap);
TestMgr.check("u1", result.get("u1").getNames()[0]);
TestMgr.check("u2", result.get("u1").getNames()[1]);
TestMgr.check("u3", result.get("u2").getNames()[0]);
TestMgr.check("u4", result.get("u2").getNames()[1]);
userMap = new HashMap<>();
userMap.put("u1", user1);
userMap.put("u2", null);
result = codeFirst.testUserMap(userMap);
TestMgr.check(result.get("u1").getNames()[0], "u1");
TestMgr.check(result.get("u1").getNames()[1], "u2");
TestMgr.check(result.get("u2"), null);
}
private void testCodeFirstUserArray(CodeFirstPojoIntf codeFirst) {
User user1 = new User();
user1.setNames(new String[] {"u1", "u2"});
User user2 = new User();
user2.setNames(new String[] {"u3", "u4"});
User[] users = new User[] {user1, user2};
List<User> result = codeFirst.testUserArray(Arrays.asList(users));
TestMgr.check("u1", result.get(0).getNames()[0]);
TestMgr.check("u2", result.get(0).getNames()[1]);
TestMgr.check("u3", result.get(1).getNames()[0]);
TestMgr.check("u4", result.get(1).getNames()[1]);
}
private void testCodeFirstStrings(CodeFirstPojoIntf codeFirst) {
String[] result = codeFirst.testStrings(new String[] {"a", "b"});
TestMgr.check("aa0", result[0]);
TestMgr.check("b", result[1]);
}
private void testCodeFirstBytes(CodeFirstPojoIntf codeFirst) {
byte[] input = new byte[] {0, 1, 2};
byte[] result = codeFirst.testBytes(input);
TestMgr.check(3, result.length);
TestMgr.check(1, result[0]);
TestMgr.check(1, result[1]);
TestMgr.check(2, result[2]);
}
private void testCodeFirstAddDate(CodeFirstPojoIntf codeFirst) {
Date date = new Date();
int seconds = 1;
Date result = codeFirst.addDate(date, seconds);
TestMgr.check(new Date(date.getTime() + seconds * 1000), result);
}
private void testCodeFirstAddString(CodeFirstPojoIntf codeFirst) {
String result = codeFirst.addString(Arrays.asList("a", "b"));
TestMgr.check("ab", result);
}
private void testCodeFirstIsTrue(CodeFirstPojoIntf codeFirst) {
boolean result = codeFirst.isTrue();
TestMgr.check(true, result);
}
private void testCodeFirstSayHi2(CodeFirstPojoIntf codeFirst) {
if (!CodeFirstPojoClientIntf.class.isInstance(codeFirst)) {
return;
}
String result = ((CodeFirstPojoClientIntf) codeFirst).sayHi2("world");
TestMgr.check("world sayhi 2", result);
}
private void testCodeFirstSayHi(CodeFirstPojoIntf codeFirst) {
String result = codeFirst.sayHi("world");
TestMgr.check("world sayhi, context k: null", result);
// TestMgr.check(202, responseEntity.getStatusCode());
}
private void testCodeFirstSaySomething(CodeFirstPojoIntf codeFirst) {
Person person = new Person();
person.setName("person name");
String result = codeFirst.saySomething("prefix prefix", person);
TestMgr.check("prefix prefix person name", result);
}
private void testCodeFirstSayHello(CodeFirstPojoIntf codeFirst) {
Person input = new Person();
input.setName("person name");
Person result = codeFirst.sayHello(input);
TestMgr.check("hello person name", result.getName());
}
private void testCodeFirstReduce(CodeFirstPojoIntf codeFirst) {
int result = codeFirst.reduce(5, 3);
TestMgr.check(2, result);
}
}