Skip to content

Commit f63dee6

Browse files
committed
A basic test for ca datasource
1 parent 4411287 commit f63dee6

2 files changed

Lines changed: 243 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.epics.gpclient.datasource.ca;
2+
3+
import java.time.Duration;
4+
import java.util.List;
5+
import java.util.logging.Logger;
6+
7+
import org.epics.gpclient.GPClientConfiguration;
8+
import org.epics.gpclient.GPClientInstance;
9+
import org.epics.gpclient.PVEvent;
10+
import org.epics.gpclient.PVEventRecorder;
11+
import org.epics.gpclient.PVReader;
12+
import org.epics.gpclient.ProbeCollector;
13+
import org.epics.gpclient.datasource.DataSource;
14+
import org.epics.gpclient.datasource.DataSourceProvider;
15+
import org.epics.vtype.VType;
16+
import org.junit.AfterClass;
17+
import org.junit.BeforeClass;
18+
import org.junit.Test;
19+
20+
public class CAChannelTest {
21+
private static final Logger log = Logger.getLogger(CAChannelTest.class.getName());
22+
23+
static GPClientInstance gpClient;
24+
25+
@BeforeClass
26+
public static void setup() {
27+
28+
log.info("Creating the context");
29+
// Start the test server
30+
InMemoryCAServer.initializeServerInstance();
31+
32+
gpClient = new GPClientConfiguration().defaultMaxRate(Duration.ofMillis(50))
33+
.notificationExecutor(org.epics.util.concurrent.Executors.localThread())
34+
.dataSource(DataSourceProvider.createDataSource())
35+
.dataProcessingThreadPool(java.util.concurrent.Executors.newScheduledThreadPool(
36+
Math.max(1, Runtime.getRuntime().availableProcessors() - 1),
37+
org.epics.util.concurrent.Executors.namedPool("PVMgr Worker ")))
38+
.build();
39+
}
40+
41+
@AfterClass
42+
public static void teardown() {
43+
44+
log.info("cleaning up the context and channels");
45+
try {
46+
gpClient.close();
47+
// Stop the server
48+
InMemoryCAServer.closeServerInstance();
49+
50+
} catch (IllegalStateException e) {
51+
e.printStackTrace();
52+
}
53+
}
54+
55+
@Test
56+
public void createSimpleChannel() throws InterruptedException {
57+
ProbeCollector probe = ProbeCollector.create();
58+
PVEventRecorder recorder = probe.getRecorder();
59+
PVReader<VType> pv = gpClient.read("ca://test_double_0").addListener(recorder).start();
60+
recorder.wait(500, recorder.forAConnectionEvent());
61+
recorder.wait(50, recorder.anEventOfType(PVEvent.Type.VALUE));
62+
pv.close();
63+
Thread.sleep(1000);
64+
List<PVEvent> events = recorder.getEvents();
65+
events.stream().forEachOrdered(event -> {
66+
System.out.println(event.toString());
67+
});
68+
}
69+
}
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package org.epics.gpclient.datasource.ca;
2+
3+
import java.util.Random;
4+
import java.util.concurrent.atomic.AtomicBoolean;
5+
6+
import com.cosylab.epics.caj.cas.util.DefaultServerImpl;
7+
import com.cosylab.epics.caj.cas.util.MemoryProcessVariable;
8+
9+
import gov.aps.jca.CAException;
10+
import gov.aps.jca.JCALibrary;
11+
import gov.aps.jca.cas.ServerContext;
12+
import gov.aps.jca.dbr.DBR_Double;
13+
import gov.aps.jca.dbr.DBR_Float;
14+
import gov.aps.jca.dbr.DBR_Int;
15+
import gov.aps.jca.dbr.DBR_String;
16+
17+
/**
18+
* Create an inmemory channel access server
19+
*
20+
* @author Kunal Shroff
21+
*
22+
*/
23+
public class InMemoryCAServer {
24+
25+
/**
26+
* JCA server context.
27+
*/
28+
private static ServerContext context = null;
29+
private static AtomicBoolean initialized = new AtomicBoolean(false);
30+
31+
public static boolean initializeServerInstance() {
32+
if (!initialized.get()) {
33+
initialize();
34+
}
35+
return initialized.get();
36+
}
37+
38+
public static void closeServerInstance() {
39+
if (initialized.get()) {
40+
try {
41+
context.destroy();
42+
} catch (IllegalStateException | CAException e) {
43+
e.printStackTrace();
44+
}
45+
}
46+
}
47+
48+
private static final Random generator = new Random();
49+
50+
private static void initialize() {
51+
52+
// Get the JCALibrary instance.
53+
JCALibrary jca = JCALibrary.getInstance();
54+
55+
// Create server implementation
56+
DefaultServerImpl server = new DefaultServerImpl();
57+
58+
// Create a context with default configuration values.
59+
try {
60+
context = jca.createServerContext(JCALibrary.CHANNEL_ACCESS_SERVER_JAVA, server);
61+
} catch (CAException e) {
62+
e.printStackTrace();
63+
}
64+
65+
// Display basic information about the context.
66+
System.out.println(context.getVersion().getVersionString());
67+
context.printInfo();
68+
System.out.println();
69+
70+
// register process variables
71+
registerProcessVariables(server);
72+
initialized.set(true);
73+
}
74+
75+
private static void registerProcessVariables(DefaultServerImpl server) {
76+
for (int i = 0; i < 10000; i++) {
77+
createDoubleProcessVariable("test_double_" + i, generator.doubles(-10, 10).findAny().getAsDouble(), server);
78+
createIntProcessVariable("test_int_" + i, generator.ints(-10, 10).findAny().getAsInt(), server);
79+
createFloatProcessVariable("test_long_" + i, generator.nextFloat(), server);
80+
createStringProcessVariable("test_String_" + i, String.valueOf(i), server);
81+
}
82+
}
83+
84+
private static void createDoubleProcessVariable(String name, double value, DefaultServerImpl server) {
85+
// PV supporting all GR/CTRL info
86+
MemoryProcessVariable mpv = new MemoryProcessVariable(name, null, DBR_Double.TYPE, new double[] { value });
87+
88+
mpv.setUpperDispLimit(new Double(10));
89+
mpv.setLowerDispLimit(new Double(-10));
90+
91+
mpv.setUpperAlarmLimit(new Double(9));
92+
mpv.setLowerAlarmLimit(new Double(-9));
93+
94+
mpv.setUpperCtrlLimit(new Double(8));
95+
mpv.setLowerCtrlLimit(new Double(-8));
96+
97+
mpv.setUpperWarningLimit(new Double(7));
98+
mpv.setLowerWarningLimit(new Double(-7));
99+
100+
mpv.setUnits("units");
101+
mpv.setPrecision((short) 3);
102+
103+
server.registerProcessVaribale(mpv);
104+
}
105+
106+
private static void createIntProcessVariable(String name, int value, DefaultServerImpl server) {
107+
// PV supporting all GR/CTRL info
108+
MemoryProcessVariable mpv = new MemoryProcessVariable(name, null, DBR_Int.TYPE, new int[] { value });
109+
110+
mpv.setUpperDispLimit(new Double(10));
111+
mpv.setLowerDispLimit(new Double(-10));
112+
113+
mpv.setUpperAlarmLimit(new Double(9));
114+
mpv.setLowerAlarmLimit(new Double(-9));
115+
116+
mpv.setUpperCtrlLimit(new Double(8));
117+
mpv.setLowerCtrlLimit(new Double(-8));
118+
119+
mpv.setUpperWarningLimit(new Double(7));
120+
mpv.setLowerWarningLimit(new Double(-7));
121+
122+
mpv.setUnits("units");
123+
mpv.setPrecision((short) 3);
124+
125+
server.registerProcessVaribale(mpv);
126+
}
127+
128+
129+
private static void createFloatProcessVariable(String name, float value, DefaultServerImpl server) {
130+
// PV supporting all GR/CTRL info
131+
MemoryProcessVariable mpv = new MemoryProcessVariable(name, null, DBR_Float.TYPE, new float[] { value });
132+
133+
mpv.setUpperDispLimit(new Double(10));
134+
mpv.setLowerDispLimit(new Double(-10));
135+
136+
mpv.setUpperAlarmLimit(new Double(9));
137+
mpv.setLowerAlarmLimit(new Double(-9));
138+
139+
mpv.setUpperCtrlLimit(new Double(8));
140+
mpv.setLowerCtrlLimit(new Double(-8));
141+
142+
mpv.setUpperWarningLimit(new Double(7));
143+
mpv.setLowerWarningLimit(new Double(-7));
144+
145+
mpv.setUnits("units");
146+
mpv.setPrecision((short) 3);
147+
148+
server.registerProcessVaribale(mpv);
149+
}
150+
151+
private static void createStringProcessVariable(String name, String value, DefaultServerImpl server) {
152+
// PV supporting all GR/CTRL info
153+
MemoryProcessVariable mpv = new MemoryProcessVariable(name, null, DBR_String.TYPE, new String[] { value });
154+
server.registerProcessVaribale(mpv);
155+
}
156+
157+
public static void main(String[] args) throws IllegalStateException, CAException {
158+
InMemoryCAServer.initializeServerInstance();
159+
try {
160+
context.run(0);
161+
Thread.sleep(30000);
162+
context.printInfo(System.out);
163+
} catch (IllegalStateException e) {
164+
e.printStackTrace();
165+
} catch (CAException e) {
166+
e.printStackTrace();
167+
} catch (InterruptedException e) {
168+
e.printStackTrace();
169+
} finally {
170+
context.destroy();
171+
}
172+
}
173+
174+
}

0 commit comments

Comments
 (0)