Skip to content

Commit 6c896e0

Browse files
committed
Implemented Server features: BootNotification, ChangeAvailability, ChangeConfiguration.
1 parent 688834e commit 6c896e0

File tree

12 files changed

+155
-39
lines changed

12 files changed

+155
-39
lines changed

ocpp-common/src/main/java/eu/chargetime/ocpp/ServerEvents.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ of this software and associated documentation files (the "Software"), to deal
2626

2727
public interface ServerEvents {
2828
void newSession(int identity);
29+
30+
void lostSession(int identity);
2931
}

ocpp-v1_6-test/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@
6262
<version>4.12</version>
6363
<scope>test</scope>
6464
</dependency>
65-
<dependency>
65+
<!--<dependency>
6666
<groupId>org.codehaus.groovy</groupId>
6767
<artifactId>groovy-all</artifactId>
6868
<version>2.4.4</version>
6969
<scope>test</scope>
70-
</dependency>
70+
</dependency>-->
7171
<dependency>
7272
<groupId>org.spockframework</groupId>
7373
<artifactId>spock-core</artifactId>

ocpp-v1_6-test/src/main/java/eu/chargetime/ocpp/test/FakeCentralSystem.java

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package eu.chargetime.ocpp.test;
22

33
import eu.chargetime.ocpp.JSONServer;
4+
import eu.chargetime.ocpp.ServerEvents;
45
import eu.chargetime.ocpp.feature.profile.ServerCoreEventHandler;
56
import eu.chargetime.ocpp.feature.profile.ServerCoreProfile;
7+
import eu.chargetime.ocpp.model.Confirmation;
68
import eu.chargetime.ocpp.model.Request;
7-
import eu.chargetime.ocpp.model.core.AuthorizationStatus;
8-
import eu.chargetime.ocpp.model.core.AuthorizeConfirmation;
9-
import eu.chargetime.ocpp.model.core.AuthorizeRequest;
10-
import eu.chargetime.ocpp.model.core.IdTagInfo;
9+
import eu.chargetime.ocpp.model.core.*;
10+
11+
import java.util.Calendar;
1112

1213
/*
1314
ChargeTime.eu - Java-OCA-OCPP
@@ -38,8 +39,11 @@ of this software and associated documentation files (the "Software"), to deal
3839
public class FakeCentralSystem
3940
{
4041
private Request receivedRequest;
42+
private Confirmation receivedConfirmation;
4143
private JSONServer server;
4244

45+
private int sessionIndex;
46+
4347
private static FakeCentralSystem instance;
4448
public static FakeCentralSystem getInstance () {
4549
if (instance == null)
@@ -51,6 +55,9 @@ private FakeCentralSystem() { }
5155

5256
public void started() throws Exception
5357
{
58+
if (server != null)
59+
return;
60+
5461
server = new JSONServer(new ServerCoreProfile(new ServerCoreEventHandler() {
5562
@Override
5663
public AuthorizeConfirmation handleAuthorizeRequest(int sessionIndex, AuthorizeRequest request) {
@@ -61,8 +68,31 @@ public AuthorizeConfirmation handleAuthorizeRequest(int sessionIndex, AuthorizeR
6168
confirmation.setIdTagInfo(tagInfo);
6269
return confirmation;
6370
}
71+
72+
@Override
73+
public BootNotificationConfirmation handleBootNotificationRequest(int sessionIndex, BootNotificationRequest request) {
74+
receivedRequest = request;
75+
BootNotificationConfirmation confirmation = new BootNotificationConfirmation();
76+
try {
77+
confirmation.setInterval(1);
78+
} catch (Exception e) {
79+
}
80+
confirmation.setCurrentTime(Calendar.getInstance());
81+
confirmation.setStatus(RegistrationStatus.Accepted);
82+
return confirmation;
83+
}
6484
}));
65-
server.open("localhost", 8887, null);
85+
server.open("localhost", 8887, new ServerEvents() {
86+
@Override
87+
public void newSession(int identity) {
88+
sessionIndex = identity;
89+
}
90+
91+
@Override
92+
public void lostSession(int identity) {
93+
sessionIndex = -1;
94+
}
95+
});
6696
}
6797

6898
public boolean hasHandledAuthorizeRequest() {
@@ -72,4 +102,40 @@ public boolean hasHandledAuthorizeRequest() {
72102
public void stopped() {
73103
server.close();
74104
}
105+
106+
public boolean hasHandledBootNotification(String vendor, String model) {
107+
boolean result = receivedRequest instanceof BootNotificationRequest;
108+
if (result) {
109+
BootNotificationRequest request = (BootNotificationRequest) this.receivedRequest;
110+
result &= request.getChargePointVendor().equals(vendor);
111+
result &= request.getChargePointModel().equals(model);
112+
}
113+
return result;
114+
}
115+
116+
public void sendChangeAvailabilityRequest(int connectorId, AvailabilityType type) throws Exception {
117+
ChangeAvailabilityRequest request = new ChangeAvailabilityRequest();
118+
request.setType(type);
119+
request.setConnectorId(connectorId);
120+
server.send(sessionIndex, request).whenComplete((confirmation, throwable) -> receivedConfirmation = confirmation);
121+
122+
}
123+
124+
public boolean hasReceivedChangeAvailabilityConfirmation(String status) {
125+
boolean result = receivedConfirmation instanceof ChangeAvailabilityConfirmation;
126+
if (result)
127+
result &= ((ChangeAvailabilityConfirmation) receivedConfirmation).getStatus().equals(status);
128+
return result;
129+
}
130+
131+
public void sendChangeConfigurationRequest(String key, String value) throws Exception {
132+
ChangeConfigurationRequest request = new ChangeConfigurationRequest();
133+
request.setKey(key);
134+
request.setValue(value);
135+
server.send(sessionIndex, request).whenComplete((confirmation, throwable) -> receivedConfirmation = confirmation);
136+
}
137+
138+
public boolean hasReceivedChangeConfigurationConfirmation() {
139+
return receivedConfirmation instanceof ChangeConfigurationConfirmation;
140+
}
75141
}

ocpp-v1_6-test/src/main/java/eu/chargetime/ocpp/test/FakeChargePoint.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ public GetConfigurationConfirmation handleGetConfigurationRequest(GetConfigurati
6262
@Override
6363
public ChangeConfigurationConfirmation handleChangeConfigurationRequest(ChangeConfigurationRequest request) {
6464
receivedRequest = request;
65-
return new ChangeConfigurationConfirmation();
65+
ChangeConfigurationConfirmation confirmation = new ChangeConfigurationConfirmation();
66+
confirmation.setStatus(ConfigurationStatus.Accepted);
67+
return confirmation;
6668
}
6769

6870
@Override
@@ -183,9 +185,9 @@ private void send(Request request) {
183185
}
184186
}
185187

186-
public boolean hasReceivedBootConfirmation(RegistrationStatus status) {
188+
public boolean hasReceivedBootConfirmation(String status) {
187189
if (receivedConfirmation instanceof BootNotificationConfirmation)
188-
return ((BootNotificationConfirmation) receivedConfirmation).objStatus().equals(status);
190+
return ((BootNotificationConfirmation) receivedConfirmation).getStatus().equals(status);
189191
return false;
190192
}
191193

ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/AuthorizeSpec.groovy

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import eu.chargetime.ocpp.test.FakeCentralSystem
44
import eu.chargetime.ocpp.test.FakeChargePoint
55
import spock.lang.Shared
66
import spock.lang.Specification
7-
import spock.util.concurrent.PollingConditions;
7+
import spock.util.concurrent.PollingConditions
88

99
class AuthorizeSpec extends Specification
1010
{
1111
@Shared
12-
FakeCentralSystem centralSystem = new FakeCentralSystem();
12+
FakeCentralSystem centralSystem = FakeCentralSystem.instance;
1313
@Shared FakeChargePoint chargePoint = new FakeChargePoint();
1414

1515
def setupSpec() {
@@ -23,7 +23,6 @@ class AuthorizeSpec extends Specification
2323

2424
def cleanup() {
2525
chargePoint.disconnect();
26-
centralSystem.stopped();
2726
}
2827

2928
def "Charge point sends Authorize request and receives a response"() {

ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/BootNotification.groovy renamed to ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/BootNotificationSpec.groovy

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package eu.chargetime.ocpp.test.core
22

3-
import eu.chargetime.ocpp.model.core.RegistrationStatus
3+
import eu.chargetime.ocpp.test.FakeCentralSystem
44
import eu.chargetime.ocpp.test.FakeChargePoint
5-
import eu.chargetime.ocpp.test.OldFakeCentralSystem
65
import spock.lang.Shared
76
import spock.lang.Specification
87
import spock.util.concurrent.PollingConditions
98

10-
class BootNotification extends Specification
9+
class BootNotificationSpec extends Specification
1110
{
1211
@Shared
13-
OldFakeCentralSystem centralSystem = OldFakeCentralSystem.getInstance();
12+
FakeCentralSystem centralSystem = FakeCentralSystem.instance;
1413
@Shared FakeChargePoint chargePoint = new FakeChargePoint();
1514

1615
def setupSpec() {
@@ -33,15 +32,12 @@ class BootNotification extends Specification
3332

3433
then:
3534
conditions.eventually {
36-
assert centralSystem.hasReceivedBootNotification("VendorX", "SingleSocketCharger");
35+
assert centralSystem.hasHandledBootNotification("VendorX", "SingleSocketCharger");
3736
}
3837

39-
when:
40-
centralSystem.sendBootConfirmation(RegistrationStatus.Accepted);
41-
4238
then:
4339
conditions.eventually {
44-
assert chargePoint.hasReceivedBootConfirmation(RegistrationStatus.Accepted);
40+
assert chargePoint.hasReceivedBootConfirmation("Accepted");
4541
}
4642
}
4743
}

ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/ChangeAvailability.groovy renamed to ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/ChangeAvailabilitySpec.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package eu.chargetime.ocpp.test.core
22

33
import eu.chargetime.ocpp.model.core.AvailabilityType
4+
import eu.chargetime.ocpp.test.FakeCentralSystem
45
import eu.chargetime.ocpp.test.FakeChargePoint
5-
import eu.chargetime.ocpp.test.OldFakeCentralSystem
66
import spock.lang.Shared
77
import spock.lang.Specification
88
import spock.util.concurrent.PollingConditions
99

10-
class ChangeAvailability extends Specification
10+
class ChangeAvailabilitySpec extends Specification
1111
{
1212
@Shared
13-
OldFakeCentralSystem centralSystem = OldFakeCentralSystem.getInstance();
13+
FakeCentralSystem centralSystem = FakeCentralSystem.instance;
1414
@Shared FakeChargePoint chargePoint = new FakeChargePoint();
1515

1616
def setupSpec() {
@@ -29,7 +29,7 @@ class ChangeAvailability extends Specification
2929
def "Central System sends a ChangeAvailability request and receives a response"() {
3030
def conditions = new PollingConditions(timeout: 1)
3131
when:
32-
centralSystem.sendChangeAvailabilityRequest(0, AvailabilityType.Inoperative);
32+
centralSystem.sendChangeAvailabilityRequest(1, AvailabilityType.Inoperative);
3333

3434
then:
3535
conditions.eventually {

ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/ChangeConfiguration.groovy renamed to ocpp-v1_6-test/src/test/groovy/eu/chargetime/ocpp/test/core/ChangeConfigurationSpec.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package eu.chargetime.ocpp.test.core
22

3+
import eu.chargetime.ocpp.test.FakeCentralSystem
34
import eu.chargetime.ocpp.test.FakeChargePoint
4-
import eu.chargetime.ocpp.test.OldFakeCentralSystem
55
import spock.lang.Shared
66
import spock.lang.Specification
77
import spock.util.concurrent.PollingConditions
88

9-
class ChangeConfiguration extends Specification
9+
class ChangeConfigurationSpec extends Specification
1010
{
1111
@Shared
12-
OldFakeCentralSystem centralSystem = OldFakeCentralSystem.getInstance();
12+
FakeCentralSystem centralSystem = FakeCentralSystem.instance;
1313
@Shared FakeChargePoint chargePoint = new FakeChargePoint();
1414

1515
def setupSpec() {

ocpp-v1_6/src/main/java/eu/chargetime/ocpp/feature/profile/ServerCoreEventHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ of this software and associated documentation files (the "Software"), to deal
2626

2727
import eu.chargetime.ocpp.model.core.AuthorizeConfirmation;
2828
import eu.chargetime.ocpp.model.core.AuthorizeRequest;
29+
import eu.chargetime.ocpp.model.core.BootNotificationConfirmation;
30+
import eu.chargetime.ocpp.model.core.BootNotificationRequest;
2931

3032
public interface ServerCoreEventHandler {
3133
AuthorizeConfirmation handleAuthorizeRequest(int sessionIndex, AuthorizeRequest request);
34+
35+
BootNotificationConfirmation handleBootNotificationRequest(int sessionIndex, BootNotificationRequest request);
3236
}

ocpp-v1_6/src/main/java/eu/chargetime/ocpp/feature/profile/ServerCoreProfile.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,32 @@ of this software and associated documentation files (the "Software"), to deal
2424
SOFTWARE.
2525
*/
2626

27-
import eu.chargetime.ocpp.feature.AuthorizeFeature;
28-
import eu.chargetime.ocpp.feature.Feature;
27+
import eu.chargetime.ocpp.feature.*;
2928
import eu.chargetime.ocpp.model.Confirmation;
3029
import eu.chargetime.ocpp.model.Request;
3130
import eu.chargetime.ocpp.model.core.AuthorizeRequest;
31+
import eu.chargetime.ocpp.model.core.BootNotificationRequest;
32+
33+
import java.util.HashSet;
3234

3335
public class ServerCoreProfile implements Profile {
3436

3537
private ServerCoreEventHandler handler;
38+
private HashSet<Feature> features;
3639

3740
public ServerCoreProfile(ServerCoreEventHandler handler) {
3841
this.handler = handler;
42+
43+
features = new HashSet<>();
44+
features.add(new AuthorizeFeature(this));
45+
features.add(new BootNotificationFeature(this));
46+
features.add(new ChangeAvailabilityFeature(this));
47+
features.add(new ChangeConfigurationFeature(this));
3948
}
4049

4150
@Override
4251
public Feature[] getFeatureList() {
43-
Feature[] features = new Feature[1];
44-
features[0] = new AuthorizeFeature(this);
45-
return features;
52+
return features.toArray(new Feature[0]);
4653
}
4754

4855
@Override
@@ -51,6 +58,8 @@ public Confirmation handleRequest(int sessionIndex, Request request) {
5158

5259
if (request instanceof AuthorizeRequest) {
5360
result = handler.handleAuthorizeRequest(sessionIndex, (AuthorizeRequest) request);
61+
} else if (request instanceof BootNotificationRequest) {
62+
result = handler.handleBootNotificationRequest(sessionIndex, (BootNotificationRequest) request);
5463
}
5564

5665
return result;

0 commit comments

Comments
 (0)