source: trunk/legacy/jvmlink/src/main/c++/TestC2.cpp @ 7812

Revision 7812, 12.9 KB checked in by mario, 8 years ago (diff)

added minimal changes to compile on a POSIX like OS (mainly Linux)

Line 
1//
2// TestC2.cpp
3//
4
5/*
6JVMLink client/server architecture for communicating between Java and
7non-Java programs using sockets.
8Copyright (c) 2008 Hidayath Ansari and Curtis Rueden. All rights reserved.
9
10Redistribution and use in source and binary forms, with or without
11modification, are permitted provided that the following conditions are met:
12  * Redistributions of source code must retain the above copyright
13    notice, this list of conditions and the following disclaimer.
14  * Redistributions in binary form must reproduce the above copyright
15    notice, this list of conditions and the following disclaimer in the
16    documentation and/or other materials provided with the distribution.
17  * Neither the name of the UW-Madison LOCI nor the names of its
18    contributors may be used to endorse or promote products derived from
19    this software without specific prior written permission.
20
21THIS SOFTWARE IS PROVIDED BY THE UW-MADISON LOCI ``AS IS'' AND ANY
22EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
25DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*/
32
33#ifdef _WIN32
34#include <stdafx.h>
35#else
36#include <unistd.h> // for usleep()
37#endif
38
39#include "JVMLinkClient.h"
40
41#include <ctime> // for time()
42#include <cstdlib> // for srand() and rand()
43#include <iostream> // for cout and cerr
44#include <stdio.h> // for getchar
45
46bool randomBool() {
47        return rand() % 2 == 0;
48}
49Byte randomByte() {
50        Byte b;
51        b.data = (int) (rand() % 128);
52        return b;
53}
54char randomChar() {
55        return (char) (rand() % (127 - 33 + 1)) + 33;
56}
57double randomDouble() {
58        return (double) rand();
59}
60float randomFloat() {
61        return (float) rand();
62}
63int randomInt() {
64        return rand() + 65536;
65}
66long long randomLong() {
67        return (long long) rand() + 0xffffffffL;
68}
69short randomShort() {
70        return (short) rand();
71}
72
73void printBools(bool* values, int len) {
74        for (int i=0; i<len; i++) std::cout << " " << values[i];
75}
76
77void printBytes(Byte* values, int off, int len) {
78        for (int i=off; i<off+len; i++) std::cout << " " << values[i].data;
79}
80
81void printChars(char* values, int len) {
82        for (int i=0; i<len; i++) std::cout << " " << values[i];
83}
84
85void printDoubles(double* values, int len) {
86        for (int i=0; i<len; i++) std::cout << " " << values[i];
87}
88
89void printFloats(float* values, int len) {
90        for (int i=0; i<len; i++) std::cout << " " << values[i];
91}
92
93void printInts(int* values, int len) {
94        for (int i=0; i<len; i++) std::cout << " " << values[i];
95}
96
97void printLongs(long long* values, int len) {
98        for (int i=0; i<len; i++) std::cout << " " << values[i];
99}
100
101void printShorts(short* values, int len) {
102        for (int i=0; i<len; i++) std::cout << " " << values[i];
103}
104
105void printStrings(std::string* values, int len) {
106        for (int i=0; i<len; i++) {
107                std::cout << "\t" << values[i] << std::endl;
108        }
109}
110
111// Tests the JVMLink API.
112int main(int argc, char* argv[])
113{
114        JVMLinkClient *p = new JVMLinkClient();
115        p->startJava(20345, "jvmlink.jar");
116        while (p->establishConnection() != JVMLinkClient::CONNECTION_SUCCESS) {
117#ifdef _WIN32
118                Sleep(250);
119#else
120                usleep(250 * 1000);
121#endif
122        }
123
124        srand((int) time(0));
125
126        // bool variables
127        bool myBool = randomBool();
128        p->setVar("myBool", myBool);
129        std::cout << "TestC2: setVar: myBool -> " << myBool << std::endl;
130        JVMLinkObject* jvmBool = p->getVar("myBool");
131        std::cout << "TestC2: getVar: myBool == " << jvmBool->getDataAsBool() << std::endl;
132
133        // Byte variables
134        Byte myByte = randomByte();
135        p->setVar("myByte", myByte);
136        std::cout << "TestC2: setVar: myByte -> " << myByte.data << std::endl;
137        JVMLinkObject* jvmByte = p->getVar("myByte");
138        std::cout << "TestC2: getVar: myByte == " << jvmByte->getDataAsByte().data << std::endl;
139
140        // char variables
141        char myChar = randomChar();
142        p->setVar("myChar", myChar);
143        std::cout << "TestC2: setVar: myChar -> " << myChar << std::endl;
144        JVMLinkObject* jvmChar = p->getVar("myChar");
145        std::cout << "TestC2: getVar: myChar == " << jvmChar->getDataAsChar() << std::endl;
146
147        // double variables
148        double myDouble = randomDouble();
149        p->setVar("myDouble", myDouble);
150        std::cout << "TestC2: setVar: myDouble -> " << myDouble << std::endl;
151        JVMLinkObject* jvmDouble = p->getVar("myDouble");
152        std::cout << "TestC2: getVar: myDouble == " << jvmDouble->getDataAsDouble() << std::endl;
153
154        // float variables
155        float myFloat = randomFloat();
156        p->setVar("myFloat", myFloat);
157        std::cout << "TestC2: setVar: myFloat -> " << myFloat << std::endl;
158        JVMLinkObject* jvmFloat = p->getVar("myFloat");
159        std::cout << "TestC2: getVar: myFloat == " << jvmFloat->getDataAsFloat() << std::endl;
160
161        // int variables
162        int myInt = randomInt();
163        p->setVar("myInt", myInt);
164        std::cout << "TestC2: setVar: myInt -> " << myInt << std::endl;
165        JVMLinkObject* jvmInt = p->getVar("myInt");
166        std::cout << "TestC2: getVar: myInt == " << jvmInt->getDataAsInt() <<
167                (jvmInt->isDataNull() ? " (NULL)" : " (not NULL)") << std::endl;
168
169        // long variables
170        long long myLong = randomLong();
171        p->setVar("myLong", myLong);
172        std::cout << "TestC2: setVar: myLong -> " << myLong << std::endl;
173        JVMLinkObject* jvmLong = p->getVar("myLong");
174        std::cout << "TestC2: getVar: myLong == " << jvmLong->getDataAsLong() << std::endl;
175
176        // short variables
177        short myShort = randomShort();
178        p->setVar("myShort", myShort);
179        std::cout << "TestC2: setVar: myShort -> " << myShort << std::endl;
180        JVMLinkObject* jvmShort = p->getVar("myShort");
181        std::cout << "TestC2: getVar: myShort == " << jvmShort->getDataAsShort() << std::endl;
182
183        // std::string variables
184        std::string myString = "<<The quick brown fox jumps over the lazy dog.>>";
185        p->setVar("myString", &myString);
186        std::cout << "TestC2: setVar: myString -> " << myString << std::endl;
187        JVMLinkObject* jvmString = p->getVar("myString");
188        std::cout << "TestC2: getVar: myString == " << *jvmString->getDataAsString() << std::endl;
189
190        // null variable
191        p->setVarNull("myInt");
192        std::cout << "TestC2: setVar: myInt -> NULL" << std::endl;
193        JVMLinkObject* jvmNull = p->getVar("myInt");
194        std::cout << "TestC2: getVar: myInt == " <<
195                (jvmNull->isDataNull() ? "NULL" : "not NULL") << std::endl;
196
197        // non-existent variable
198        JVMLinkObject* jvmNonExist = p->getVar("myNonExist");
199        std::cout << "TestC2: getVar: myNonExist == " <<
200                (jvmNonExist->isDataNull() ? "NULL" : "not NULL") << std::endl;
201
202        // arrays
203        const int num = 15;
204        bool* myBools = new bool[num];
205        Byte* myBytes = new Byte[num];
206        char* myChars = new char[num];
207        double* myDoubles = new double[num];
208        float* myFloats = new float[num];
209        int* myInts = new int[num];
210        long long* myLongs = new long long[num];
211        short* myShorts = new short[num];
212
213        for (int i=0; i<num; i++) {
214                myBools[i] = randomBool();
215                myBytes[i] = randomByte();
216                myChars[i] = randomChar();
217                myDoubles[i] = randomDouble();
218                myFloats[i] = randomFloat();
219                myInts[i] = randomInt();
220                myLongs[i] = randomLong();
221                myShorts[i] = randomShort();
222        }
223
224        std::string* myStrings = new std::string[6];
225        myStrings[0] = "\"There was an Old Man with a beard,";
226        myStrings[1] = "Who said, 'It is just as I feared!";
227        myStrings[2] = "Two Owls and a Hen,";
228        myStrings[3] = "Four Larks and a Wren,";
229        myStrings[4] = "Have all built their nests in my beard!'\"";
230        myStrings[5] = "- Edward Lear";
231
232        // bool arrays
233        p->setVar("myBools", myBools, num);
234        std::cout << "TestC2: setVar: myBools -> [";
235        printBools(myBools, num);
236        std::cout << " ]" << std::endl;
237        JVMLinkObject* jvmBools = p->getVar("myBools");
238        std::cout << "TestC2: getVar: myBools == [";
239        printBools(jvmBools->getDataAsBoolArray(), num);
240        std::cout << " ]" << std::endl;
241
242        // Byte arrays
243        p->setVar("myBytes", myBytes, num);
244        std::cout << "TestC2: setVar: myBytes -> [";
245        printBytes(myBytes, 0, num);
246        std::cout << " ]" << std::endl;
247        JVMLinkObject* jvmBytes = p->getVar("myBytes");
248        std::cout << "TestC2: getVar: myBytes == [";
249        printBytes(jvmBytes->getDataAsByteArray(), 0, num);
250        std::cout << " ]" << std::endl;
251
252        // char arrays
253        p->setVar("myChars", myChars, num);
254        std::cout << "TestC2: setVar: myChars -> [";
255        printChars(myChars, num);
256        std::cout << " ]" << std::endl;
257        JVMLinkObject* jvmChars = p->getVar("myChars");
258        std::cout << "TestC2: getVar: myChars == [";
259        printChars(jvmChars->getDataAsCharArray(), num);
260        std::cout << " ]" << std::endl;
261
262        // double arrays
263        p->setVar("myDoubles", myDoubles, num);
264        std::cout << "TestC2: setVar: myDoubles -> [";
265        printDoubles(myDoubles, num);
266        std::cout << " ]" << std::endl;
267        JVMLinkObject* jvmDoubles = p->getVar("myDoubles");
268        std::cout << "TestC2: getVar: myDoubles == [";
269        printDoubles(jvmDoubles->getDataAsDoubleArray(), num);
270        std::cout << " ]" << std::endl;
271
272        // float arrays
273        p->setVar("myFloats", myFloats, num);
274        std::cout << "TestC2: setVar: myFloats -> [";
275        printFloats(myFloats, num);
276        std::cout << " ]" << std::endl;
277        JVMLinkObject* jvmFloats = p->getVar("myFloats");
278        std::cout << "TestC2: getVar: myFloats == [";
279        printFloats(jvmFloats->getDataAsFloatArray(), num);
280        std::cout << " ]" << std::endl;
281
282        // int arrays
283        p->setVar("myInts", myInts, num);
284        std::cout << "TestC2: setVar: myInts -> [";
285        printInts(myInts, num);
286        std::cout << " ]" << std::endl;
287        JVMLinkObject* jvmInts = p->getVar("myInts");
288        std::cout << "TestC2: getVar: myInts == [";
289        printInts(jvmInts->getDataAsIntArray(), num);
290        std::cout << " ]" << std::endl;
291
292        // long arrays
293        p->setVar("myLongs", myLongs, num);
294        std::cout << "TestC2: setVar: myLongs -> [";
295        printLongs(myLongs, num);
296        std::cout << " ]" << std::endl;
297        JVMLinkObject* jvmLongs = p->getVar("myLongs");
298        std::cout << "TestC2: getVar: myLongs == [";
299        printLongs(jvmLongs->getDataAsLongArray(), num);
300        std::cout << " ]" << std::endl;
301
302        // short arrays
303        p->setVar("myShorts", myShorts, num);
304        std::cout << "TestC2: setVar: myShorts -> [";
305        printShorts(myShorts, num);
306        std::cout << " ]" << std::endl;
307        JVMLinkObject* jvmShorts = p->getVar("myShorts");
308        std::cout << "TestC2: getVar: myShorts == [";
309        printShorts(jvmShorts->getDataAsShortArray(), num);
310        std::cout << " ]" << std::endl;
311
312        // std::string arrays
313        p->setVar("myStrings", myStrings, 6);
314        std::cout << "TestC2: setVar: myStrings -> [" << std::endl;
315        for (int i=0; i<6; i++) {
316                std::cout << "\t" << myStrings[i] << std::endl;
317        }
318        std::cout << "]" << std::endl;
319        JVMLinkObject* jvmStrings = p->getVar("myStrings");
320        std::cout << "TestC2: getVar: myStrings == [" << std::endl;
321        printStrings(jvmStrings->getDataAsStringArray(), 6);
322        std::cout << "]" << std::endl;
323
324        delete myBools;
325        delete myBytes;
326        delete myChars;
327        delete myDoubles;
328        delete myFloats;
329        delete myInts;
330        delete myShorts;
331        delete myLongs;
332
333        // exec commands
334        std::cout << "TestC2: trying some exec calls" << std::endl;
335        p->exec("import java.awt.BorderLayout");
336        p->exec("import javax.swing.JButton");
337        p->exec("import javax.swing.JFrame");
338        p->exec("import javax.swing.JPanel");
339        p->exec("frame = new JFrame(\"My Java Frame\")");
340        p->exec("pane = new JPanel()");
341        p->exec("frame.setContentPane(pane)");
342        p->exec("layout = new BorderLayout()");
343        p->exec("pane.setLayout(layout)");
344        p->exec("button = new JButton(\"Hello world!\")");
345        p->exec("pane.add(button, BorderLayout.CENTER)");
346        p->exec("frame.setBounds(100, 100, 500, 400)");
347        p->exec("frame.setVisible(true)");
348
349        // large Byte array
350        const int big = 10000000;
351        Byte* largeBytes = new Byte[big];
352        for (int i=0; i<big; i++) largeBytes[i] = randomByte();
353
354        p->setVar("largeBytes", largeBytes, big);
355        std::cout << "TestC2: setVar: largeBytes -> [";
356        printBytes(largeBytes, 0, 3);
357        std::cout << " ...";
358        printBytes(largeBytes, big / 2 - 1, 3);
359        std::cout << " ...";
360        printBytes(largeBytes, big - 3, 3);
361        std::cout << " ]" << std::endl;
362        JVMLinkObject* jvmLargeBytes = p->getVar("largeBytes");
363        std::cout << "TestC2: getVar: largeBytes == [";
364        Byte* largeBytes2 = jvmLargeBytes->getDataAsByteArray();
365        printBytes(largeBytes2, 0, 3);
366        std::cout << " ...";
367        printBytes(largeBytes2, big / 2 - 1, 3);
368        std::cout << " ...";
369        printBytes(largeBytes2, big - 3, 3);
370        std::cout << " ]" << std::endl;
371
372        delete largeBytes;
373
374        std::cout << std::endl << std::endl << "Press enter to shut down the server and exit..." << std::endl;
375#ifdef _WIN32
376        _fgetchar();
377#else
378        getchar();
379#endif
380
381        // free Java resources
382        p->exec("frame.dispose()");
383
384        // order the server to shut down
385        p->shutJava();
386
387        // close our connection to the server
388        p->closeConnection();
389
390        // free local resources
391        delete(p);
392
393        return 0;
394}
Note: See TracBrowser for help on using the repository browser.