Skip to content

Commit a034b44

Browse files
committed
Add unit tests.
Make some fixes related to avoid unnecessary serialization
1 parent beac028 commit a034b44

File tree

49 files changed

+3033
-151
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+3033
-151
lines changed

gxazureserverless/client.cfg

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
[Client]
2+
MODEL_NUM= 2
3+
GENERATOR_NUM= 12
4+
LDAP_LOGIN=0
5+
LOGIN_AS_USERID=0
6+
LDAP_HOST=
7+
LDAP_AUTH=simple
8+
LDAP_PRINCIPAL=
9+
LDAP_USERID_TYPE=OS
10+
SMTP_HOST=
11+
NAME_SPACE= com.gx.serverless.test
12+
NAME_HOST=
13+
CORBA_SERVER_NAME=
14+
DCOM_GUID=
15+
CONN_TIMEOUT=300
16+
HELP_MODE=WINHTML
17+
HELP_BASEURL=
18+
PREFERRED_UI=BEST
19+
JFC_LF=NATIVE
20+
CALENDAR=1
21+
CALC=1
22+
WP_RESIZE=1
23+
SHOW_STATUS=1
24+
FIELD_EXIT=Tab
25+
ESCAPE_FUNCTION=Exit_form
26+
KEY_REFRESH=5
27+
KEY_PROMPT=4
28+
MDI_FORMS=1
29+
REMOTE_CALLS=NEVER
30+
IMAGE_SUBST=0
31+
CS_CONNECT=First
32+
CS_REORG=1
33+
CS_REORGJAVA=1
34+
SUBFILE_ORDER=Y
35+
FC_READONLY=GRAYED
36+
PACKAGE=com.gx.serverless.test
37+
DECIMAL_POINT=.
38+
DATE_FMT= MDY
39+
CTOD_DATE_FMT= L
40+
BLANK_EMPTY_DATE=0
41+
TIME_FMT=12
42+
YEAR_LIMIT=40
43+
COMPRESS_HTML=1
44+
DocumentType=HTML5
45+
IE_COMPATIBILITY_VIEW=EmulateIE7
46+
WEB_IMAGE_DIR=/static
47+
HTTP_BACKEND_URL=
48+
WEB_STATIC_DIR=
49+
ORQ_CLIENT_URL=
50+
ORQ_SERVER_DIR=
51+
TMPMEDIA_DIR=PrivateTempStorage
52+
PRINT_LAYOUT_METADATA_DIR=LayoutMetadata
53+
StorageTimeZone= 1
54+
GX_BUILD_NUMBER=123400
55+
ODBC_CALLS=0
56+
NameSpace1= com.gx.serverless.test
57+
LANGUAGE=eng
58+
LANG_NAME=English
59+
Theme=Carmine
60+
CS_BLOB_PATH=PublicTempStorage
61+
SUBMIT_POOL_SIZE=5
62+
CACHE_TTL_0=-1
63+
CACHE_TTL_1=60
64+
CACHE_TTL_2=600
65+
CACHE_TTL_3=0
66+
CACHE_STORAGE_SIZE=0
67+
CACHING=0
68+
SMART_CACHING=0
69+
CACHE_INVALIDATION_TOKEN=201871916103460
70+
EVENT_BEFORE_COMMIT=
71+
EVENT_AFTER_COMMIT=
72+
EVENT_BEFORE_ROLLBACK=
73+
EVENT_AFTER_ROLLBACK=
74+
EVENT_BEFORE_CONNECT=
75+
EVENT_AFTER_CONNECT=
76+
ENABLE_MANAGEMENT=0
77+
EnableIntegratedSecurity=0
78+
IntegratedSecurityLoginWeb=
79+
IntegratedSecurityNotAuthorizedWeb=
80+
VER_STAMP=
81+
[language|English]
82+
code= eng
83+
time_fmt= 12
84+
decimal_point= .
85+
thousand_sep= ,
86+
date_fmt= MDY
87+
culture= en-US
88+
[com.serverlessbasictest]
89+
GXDB_LOCATION=
90+
JTA=0
91+
DataSource1=DEFAULT
92+
JDBC_LOG=
93+
JDBCLogEnabled=0
94+
JDBCUniqueName=0
95+
JDBCLogPath=
96+
JDBCLogLevel=0
97+
JDBCLogBuffer=0
98+
JDBCLogDetail=0
99+
[com.serverlessbasictest|DEFAULT]
100+
CS_DBNAME=
101+
INFORMIX_DB=ANSI
102+
CS_LIBL400=
103+
CS_PACKAGE400=
104+
DB2400_DATE_DATATYPE=
105+
CS_SCHEMA=
106+
USER_ID=82sPNmMP8O3TlpdEZk1r8E==
107+
USER_PASSWORD=q+TSEf35qmaJpVp4SmrATG==
108+
CS_CONNECT=First
109+
WAIT_RECORD=0
110+
LOCK_RETRY=10
111+
LoginInServer=1
112+
JDBC_DRIVER=net.sourceforge.jtds.jdbc.Driver
113+
DB_URL=jdbc:jtds:sqlserver://:1433/
114+
USE_JDBC_DATASOURCE=0
115+
JDBC_DATASOURCE=
116+
MAX_CURSOR=100
117+
INITIALIZE_NEW=1
118+
ISOLATION_LEVEL=CR
119+
XBASE_TINT=1
120+
DBMS=sqlserver
121+
UnlimitedRWPool=1
122+
PoolRWEnabled=1
123+
RecycleRW=1
124+
RecycleRWType=1
125+
RecycleRWMin=30
126+
POOLSIZE_RW=10
127+
POOL_STARTUP=0

gxazureserverless/gxazmappings.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[
2+
{
3+
"FunctionName": "TestQueueRaw",
4+
"GXEntrypoint": "com.unittest.eventdriven.queue.handlequeueazureevent"
5+
},
6+
{
7+
"FunctionName": "TestQueueEventMessage",
8+
"GXEntrypoint": "com.unittest.eventdriven.queue.handlequeueazureevent2"
9+
},
10+
{
11+
"FunctionName": "TestTimerRaw",
12+
"GXEntrypoint": "com.unittest.eventdriven.timer.handletimerazureevent"
13+
},
14+
{
15+
"FunctionName": "TestServiceBusRaw",
16+
"GXEntrypoint": "com.unittest.eventdriven.servicebus.handlesbqueueazureevent"
17+
},
18+
{
19+
"FunctionName": "TestServiceBusMessage",
20+
"GXEntrypoint": "com.unittest.eventdriven.servicebus.handlesbqueueazureevent2"
21+
},
22+
{
23+
"FunctionName": "TestEventGridRaw",
24+
"GXEntrypoint": "com.unittest.eventdriven.eventgrid.handleeventgridazure"
25+
},
26+
{
27+
"FunctionName": "TestEventGridCloud",
28+
"GXEntrypoint": "com.unittest.eventdriven.eventgridcloud.handleeventgridcloudazure"
29+
},
30+
{
31+
"FunctionName": "TestCosmosDB",
32+
"GXEntrypoint": "com.unittest.eventdriven.cosmosdb.handlecosmosdbazure"
33+
}
34+
]

gxazureserverless/log4j2.xml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration status="warn">
3+
<Properties>
4+
<Property name="logBaseDir">${main:0:-.}${sys:file.separator}logs${sys:file.separator}</Property>
5+
6+
<Property name="logFile">${logBaseDir}client.log</Property>
7+
</Properties>
8+
9+
<Appenders>
10+
<RollingFile name="RollingFile" fileName="${logFile}" filePattern="${logBaseDir}old${sys:file.separator}app-%d{yyyy-MM-dd-HH}-%i.log.gz">
11+
<PatternLayout pattern="%d{ISO8601} [%t] %-5p %c - %m%n"/>
12+
13+
<Policies>
14+
<TimeBasedTriggeringPolicy />
15+
<SizeBasedTriggeringPolicy size="10 MB"/>
16+
</Policies>
17+
</RollingFile>
18+
19+
<Console name="ConsoleAppender" target="SYSTEM_OUT">
20+
<PatternLayout pattern="%d{ISO8601} [%t] %-5p %c - %m%n"/>
21+
22+
</Console>
23+
24+
</Appenders>
25+
26+
<Loggers>
27+
<Root level="${env:LOG_LEVEL:-INFO}">
28+
<AppenderRef ref="${env:LOG_OUTPUT:-ConsoleAppender}"/>
29+
</Root>
30+
<logger name="com.genexus" level="${env:LOG_LEVEL:-INFO}" additivity="false">
31+
<AppenderRef ref="${env:LOG_OUTPUT:-ConsoleAppender}"/>
32+
</logger>
33+
<!-- User custom Logging !-->
34+
<logger name="GeneXusUserLog" level="${env:LOG_LEVEL_USER:-ALL}" additivity="false">
35+
<AppenderRef ref="${env:LOG_OUTPUT:-ConsoleAppender}"/>
36+
</logger>
37+
38+
</Loggers>
39+
</Configuration>

gxazureserverless/pom.xml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@
1313
<artifactId>gxazureserverless</artifactId>
1414
<name>GeneXus Azure Functions Handler</name>
1515

16-
<properties>
17-
<maven.compiler.source>1.8</maven.compiler.source>
18-
<maven.compiler.target>1.8</maven.compiler.target>
19-
</properties>
20-
2116
<dependencies>
2217
<dependency>
2318
<groupId>${project.groupId}</groupId>
@@ -79,11 +74,24 @@
7974
<version>4.22.3</version>
8075
</dependency>
8176

77+
<dependency>
78+
<groupId>org.mockito</groupId>
79+
<artifactId>mockito-core</artifactId>
80+
<version>5.12.0</version>
81+
</dependency>
82+
8283
<dependency>
8384
<groupId>com.fasterxml.jackson.core</groupId>
8485
<artifactId>jackson-databind</artifactId>
8586
<version>${jackson.version}</version>
8687
</dependency>
88+
89+
<dependency>
90+
<groupId>org.junit.jupiter</groupId>
91+
<artifactId>junit-jupiter</artifactId>
92+
<version>RELEASE</version>
93+
<scope>test</scope>
94+
</dependency>
8795
</dependencies>
8896

8997
<build>

gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void run(
3535

3636
msgs.add(msg);
3737

38-
SetupServerlessMappings(context.getFunctionName());
38+
setupServerlessMappings(context.getFunctionName());
3939

4040
try {
4141
EventMessageResponse response = dispatchEvent(msgs, Base64.getEncoder().encodeToString(content));

gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,24 @@ public void run(
2424

2525
EventMessages msgs = new EventMessages();
2626
EventMessagesList eventMessagesList = new EventMessagesList();
27+
String rawMessage= "";
2728

28-
switch (executor.methodSignatureIdx) {
29+
setupServerlessMappings(context.getFunctionName());
30+
31+
switch (executor.getMethodSignatureIdx()) {
2932
case 0:
3033
msgs = setupEventMessages(eventId,items);
3134
break;
3235
case 4:
3336
eventMessagesList = setupEventMessagesList(items);
3437
break;
3538
default:
39+
rawMessage = Helper.toJSONString(items);
3640
break;
3741
}
38-
SetupServerlessMappings(context.getFunctionName());
3942

4043
try {
41-
EventMessageResponse response = dispatchEvent(msgs, eventMessagesList, Helper.toJSONString(items));
44+
EventMessageResponse response = dispatchEvent(msgs, eventMessagesList, rawMessage);
4245
if (response.hasFailed()) {
4346
logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage()));
4447
throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation.
Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.genexus.cloud.serverless.azure.handler;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import com.fasterxml.jackson.databind.ObjectMapper;
45
import com.genexus.cloud.serverless.model.EventMessage;
56
import com.genexus.cloud.serverless.model.EventMessageProperty;
@@ -14,6 +15,8 @@
1415
import java.util.Objects;
1516

1617
public class AzureEventGridCloudHandler extends AzureEventHandler{
18+
EventMessages msgs = new EventMessages();
19+
String rawMessage = "";
1720

1821
public AzureEventGridCloudHandler() throws Exception {super();}
1922

@@ -22,42 +25,63 @@ public void run(
2225
final ExecutionContext context) throws Exception {
2326

2427
context.getLogger().info("GeneXus Event Grid CloudEvents trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId());
25-
SetupServerlessMappings(context.getFunctionName());
28+
setupServerlessMappings(context.getFunctionName());
29+
setupEventGridMessage(eventJson);
2630

2731
try {
28-
ObjectMapper objectMapper = new ObjectMapper();
29-
objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule());
30-
CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class);
31-
32-
EventMessages msgs = new EventMessages();
33-
EventMessage msg = new EventMessage();
34-
msg.setMessageId(cloudEvent.getId());
35-
msg.setMessageSourceType(cloudEvent.getType());
36-
msg.setMessageVersion("");
37-
38-
msg.setMessageDate(new Date());
39-
msg.setMessageData(Objects.requireNonNull(cloudEvent.getData()).toString());
40-
41-
List<EventMessageProperty> msgAtts = msg.getMessageProperties();
42-
43-
msgAtts.add(new EventMessageProperty("Id", cloudEvent.getId()));
44-
msgAtts.add(new EventMessageProperty("Subject",cloudEvent.getSubject()));
45-
msgAtts.add(new EventMessageProperty("DataContentType",cloudEvent.getDataContentType()));
46-
msgAtts.add(new EventMessageProperty("DataSchema", Objects.requireNonNull(cloudEvent.getDataSchema()).toString()));
47-
msgAtts.add(new EventMessageProperty("Source", cloudEvent.getSource().toString()));
48-
msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString()));
49-
msgAtts.add(new EventMessageProperty("Time", Objects.requireNonNull(cloudEvent.getTime()).toString()));
50-
51-
msgs.add(msg);
52-
53-
EventMessageResponse response = dispatchEvent(msgs, eventJson);
32+
EventMessageResponse response = dispatchEvent(msgs, rawMessage);
5433
if (response.hasFailed()) {
5534
logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage()));
5635
throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation.
5736
}
37+
5838
} catch (Exception e) {
5939
logger.error("HandleRequest execution error", e);
6040
throw e; //Throw the exception so the runtime can Retry the operation.
6141
}
6242
}
43+
protected void setupEventGridMessage(String eventJson) throws JsonProcessingException {
44+
45+
switch (executor.getMethodSignatureIdx()) {
46+
case 0:
47+
48+
try {
49+
ObjectMapper objectMapper = new ObjectMapper();
50+
objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule());
51+
CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class);
52+
53+
EventMessage msg = new EventMessage();
54+
msg.setMessageId(cloudEvent.getId());
55+
msg.setMessageSourceType(cloudEvent.getType());
56+
msg.setMessageVersion("");
57+
58+
msg.setMessageDate(new Date());
59+
msg.setMessageData(Objects.requireNonNull(cloudEvent.getData()).toString());
60+
61+
List<EventMessageProperty> msgAtts = msg.getMessageProperties();
62+
63+
msgAtts.add(new EventMessageProperty("Id", cloudEvent.getId()));
64+
msgAtts.add(new EventMessageProperty("Subject", cloudEvent.getSubject()));
65+
msgAtts.add(new EventMessageProperty("DataContentType", cloudEvent.getDataContentType()));
66+
if (cloudEvent.getDataSchema() != null)
67+
msgAtts.add(new EventMessageProperty("DataSchema", cloudEvent.getDataSchema().toString()));
68+
if (cloudEvent.getSource() != null)
69+
msgAtts.add(new EventMessageProperty("Source", cloudEvent.getSource().toString()));
70+
if (cloudEvent.getSpecVersion() != null)
71+
msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString()));
72+
if (cloudEvent.getTime() != null)
73+
msgAtts.add(new EventMessageProperty("Time", cloudEvent.getTime().toString()));
74+
75+
msgs.add(msg);
76+
}
77+
catch (Exception e) {
78+
logger.error("HandleRequest execution error", e);
79+
throw e;}
80+
break;
81+
case 1:
82+
case 2:
83+
rawMessage = eventJson;
84+
}
85+
}
86+
6387
}

0 commit comments

Comments
 (0)