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

Revision 7814, 12.4 KB checked in by mario, 8 years ago (diff)

use auto_ptr for an idea of memory management, and template print functions instead of many copies

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#include <memory> // for auto_ptr
46
47bool randomBool() {
48        return rand() % 2 == 0;
49}
50Byte randomByte() {
51        Byte b;
52        b.data = (int) (rand() % 128);
53        return b;
54}
55char randomChar() {
56        return (char) (rand() % (127 - 33 + 1)) + 33;
57}
58double randomDouble() {
59        return (double) rand();
60}
61float randomFloat() {
62        return (float) rand();
63}
64int randomInt() {
65        return rand() + 65536;
66}
67long long randomLong() {
68        return (long long) rand() + 0xffffffffL;
69}
70short randomShort() {
71        return (short) rand();
72}
73
74template <class T>
75void printValues(T* values, int len) {
76        for (int i=0; i<len; i++) std::cout << " " << values[i];
77}
78
79void printValues(Byte* values, int off, int len) {
80        for (int i=off; i<off+len; i++) std::cout << " " << values[i].data;
81}
82
83// Tests the JVMLink API.
84int main(int argc, char* argv[])
85{
86        JVMLinkClient *p = new JVMLinkClient();
87        p->startJava(20345, "jvmlink.jar");
88        while (p->establishConnection() != JVMLinkClient::CONNECTION_SUCCESS) {
89#ifdef _WIN32
90                Sleep(250);
91#else
92                usleep(250 * 1000);
93#endif
94        }
95
96        srand((int) time(0));
97
98        // bool variables
99        bool myBool = randomBool();
100        p->setVar("myBool", myBool);
101        std::cout << "TestC2: setVar: myBool -> " << myBool << std::endl;
102        std::auto_ptr<JVMLinkObject> jvmBool(p->getVar("myBool"));
103        std::cout << "TestC2: getVar: myBool == " << jvmBool->getDataAsBool() << std::endl;
104
105        // Byte variables
106        Byte myByte = randomByte();
107        p->setVar("myByte", myByte);
108        std::cout << "TestC2: setVar: myByte -> " << myByte.data << std::endl;
109        std::auto_ptr<JVMLinkObject> jvmByte(p->getVar("myByte"));
110        std::cout << "TestC2: getVar: myByte == " << jvmByte->getDataAsByte().data << std::endl;
111
112        // char variables
113        char myChar = randomChar();
114        p->setVar("myChar", myChar);
115        std::cout << "TestC2: setVar: myChar -> " << myChar << std::endl;
116        std::auto_ptr<JVMLinkObject> jvmChar(p->getVar("myChar"));
117        std::cout << "TestC2: getVar: myChar == " << jvmChar->getDataAsChar() << std::endl;
118
119        // double variables
120        double myDouble = randomDouble();
121        p->setVar("myDouble", myDouble);
122        std::cout << "TestC2: setVar: myDouble -> " << myDouble << std::endl;
123        std::auto_ptr<JVMLinkObject> jvmDouble(p->getVar("myDouble"));
124        std::cout << "TestC2: getVar: myDouble == " << jvmDouble->getDataAsDouble() << std::endl;
125
126        // float variables
127        float myFloat = randomFloat();
128        p->setVar("myFloat", myFloat);
129        std::cout << "TestC2: setVar: myFloat -> " << myFloat << std::endl;
130        std::auto_ptr<JVMLinkObject> jvmFloat(p->getVar("myFloat"));
131        std::cout << "TestC2: getVar: myFloat == " << jvmFloat->getDataAsFloat() << std::endl;
132
133        // int variables
134        int myInt = randomInt();
135        p->setVar("myInt", myInt);
136        std::cout << "TestC2: setVar: myInt -> " << myInt << std::endl;
137        std::auto_ptr<JVMLinkObject> jvmInt(p->getVar("myInt"));
138        std::cout << "TestC2: getVar: myInt == " << jvmInt->getDataAsInt() <<
139                (jvmInt->isDataNull() ? " (NULL)" : " (not NULL)") << std::endl;
140
141        // long variables
142        long long myLong = randomLong();
143        p->setVar("myLong", myLong);
144        std::cout << "TestC2: setVar: myLong -> " << myLong << std::endl;
145        std::auto_ptr<JVMLinkObject> jvmLong(p->getVar("myLong"));
146        std::cout << "TestC2: getVar: myLong == " << jvmLong->getDataAsLong() << std::endl;
147
148        // short variables
149        short myShort = randomShort();
150        p->setVar("myShort", myShort);
151        std::cout << "TestC2: setVar: myShort -> " << myShort << std::endl;
152        std::auto_ptr<JVMLinkObject> jvmShort(p->getVar("myShort"));
153        std::cout << "TestC2: getVar: myShort == " << jvmShort->getDataAsShort() << std::endl;
154
155        // std::string variables
156        std::string myString = "<<The quick brown fox jumps over the lazy dog.>>";
157        p->setVar("myString", &myString);
158        std::cout << "TestC2: setVar: myString -> " << myString << std::endl;
159        std::auto_ptr<JVMLinkObject> jvmString(p->getVar("myString"));
160        std::cout << "TestC2: getVar: myString == " << *jvmString->getDataAsString() << std::endl;
161
162        // null variable
163        p->setVarNull("myInt");
164        std::cout << "TestC2: setVar: myInt -> NULL" << std::endl;
165        std::auto_ptr<JVMLinkObject> jvmNull(p->getVar("myInt"));
166        std::cout << "TestC2: getVar: myInt == " <<
167                (jvmNull->isDataNull() ? "NULL" : "not NULL") << std::endl;
168
169        // non-existent variable
170        std::auto_ptr<JVMLinkObject> jvmNonExist(p->getVar("myNonExist"));
171        std::cout << "TestC2: getVar: myNonExist == " <<
172                (jvmNonExist->isDataNull() ? "NULL" : "not NULL") << std::endl;
173
174        // arrays
175        const int num = 15;
176        bool* myBools = new bool[num];
177        Byte* myBytes = new Byte[num];
178        char* myChars = new char[num];
179        double* myDoubles = new double[num];
180        float* myFloats = new float[num];
181        int* myInts = new int[num];
182        long long* myLongs = new long long[num];
183        short* myShorts = new short[num];
184
185        for (int i=0; i<num; i++) {
186                myBools[i] = randomBool();
187                myBytes[i] = randomByte();
188                myChars[i] = randomChar();
189                myDoubles[i] = randomDouble();
190                myFloats[i] = randomFloat();
191                myInts[i] = randomInt();
192                myLongs[i] = randomLong();
193                myShorts[i] = randomShort();
194        }
195
196        std::string* myStrings = new std::string[6];
197        myStrings[0] = "\"There was an Old Man with a beard,";
198        myStrings[1] = "Who said, 'It is just as I feared!";
199        myStrings[2] = "Two Owls and a Hen,";
200        myStrings[3] = "Four Larks and a Wren,";
201        myStrings[4] = "Have all built their nests in my beard!'\"";
202        myStrings[5] = "- Edward Lear";
203
204        // bool arrays
205        p->setVar("myBools", myBools, num);
206        std::cout << "TestC2: setVar: myBools -> [";
207        printValues(myBools, num);
208        std::cout << " ]" << std::endl;
209        std::auto_ptr<JVMLinkObject> jvmBools(p->getVar("myBools"));
210        std::cout << "TestC2: getVar: myBools == [";
211        printValues(jvmBools->getDataAsBoolArray(), num);
212        std::cout << " ]" << std::endl;
213
214        // Byte arrays
215        p->setVar("myBytes", myBytes, num);
216        std::cout << "TestC2: setVar: myBytes -> [";
217        printValues(myBytes, 0, num);
218        std::cout << " ]" << std::endl;
219        std::auto_ptr<JVMLinkObject> jvmBytes(p->getVar("myBytes"));
220        std::cout << "TestC2: getVar: myBytes == [";
221        printValues(jvmBytes->getDataAsByteArray(), 0, num);
222        std::cout << " ]" << std::endl;
223
224        // char arrays
225        p->setVar("myChars", myChars, num);
226        std::cout << "TestC2: setVar: myChars -> [";
227        printValues(myChars, num);
228        std::cout << " ]" << std::endl;
229        std::auto_ptr<JVMLinkObject> jvmChars(p->getVar("myChars"));
230        std::cout << "TestC2: getVar: myChars == [";
231        printValues(jvmChars->getDataAsCharArray(), num);
232        std::cout << " ]" << std::endl;
233
234        // double arrays
235        p->setVar("myDoubles", myDoubles, num);
236        std::cout << "TestC2: setVar: myDoubles -> [";
237        printValues(myDoubles, num);
238        std::cout << " ]" << std::endl;
239        std::auto_ptr<JVMLinkObject> jvmDoubles(p->getVar("myDoubles"));
240        std::cout << "TestC2: getVar: myDoubles == [";
241        printValues(jvmDoubles->getDataAsDoubleArray(), num);
242        std::cout << " ]" << std::endl;
243
244        // float arrays
245        p->setVar("myFloats", myFloats, num);
246        std::cout << "TestC2: setVar: myFloats -> [";
247        printValues(myFloats, num);
248        std::cout << " ]" << std::endl;
249        std::auto_ptr<JVMLinkObject> jvmFloats(p->getVar("myFloats"));
250        std::cout << "TestC2: getVar: myFloats == [";
251        printValues(jvmFloats->getDataAsFloatArray(), num);
252        std::cout << " ]" << std::endl;
253
254        // int arrays
255        p->setVar("myInts", myInts, num);
256        std::cout << "TestC2: setVar: myInts -> [";
257        printValues(myInts, num);
258        std::cout << " ]" << std::endl;
259        std::auto_ptr<JVMLinkObject> jvmInts(p->getVar("myInts"));
260        std::cout << "TestC2: getVar: myInts == [";
261        printValues(jvmInts->getDataAsIntArray(), num);
262        std::cout << " ]" << std::endl;
263
264        // long arrays
265        p->setVar("myLongs", myLongs, num);
266        std::cout << "TestC2: setVar: myLongs -> [";
267        printValues(myLongs, num);
268        std::cout << " ]" << std::endl;
269        std::auto_ptr<JVMLinkObject> jvmLongs(p->getVar("myLongs"));
270        std::cout << "TestC2: getVar: myLongs == [";
271        printValues(jvmLongs->getDataAsLongArray(), num);
272        std::cout << " ]" << std::endl;
273
274        // short arrays
275        p->setVar("myShorts", myShorts, num);
276        std::cout << "TestC2: setVar: myShorts -> [";
277        printValues(myShorts, num);
278        std::cout << " ]" << std::endl;
279        std::auto_ptr<JVMLinkObject> jvmShorts(p->getVar("myShorts"));
280        std::cout << "TestC2: getVar: myShorts == [";
281        printValues(jvmShorts->getDataAsShortArray(), num);
282        std::cout << " ]" << std::endl;
283
284        // std::string arrays
285        p->setVar("myStrings", myStrings, 6);
286        std::cout << "TestC2: setVar: myStrings -> [" << std::endl;
287        for (int i=0; i<6; i++) {
288                std::cout << "\t" << myStrings[i] << std::endl;
289        }
290        std::cout << "]" << std::endl;
291        std::auto_ptr<JVMLinkObject> jvmStrings(p->getVar("myStrings"));
292        std::cout << "TestC2: getVar: myStrings == [" << std::endl;
293        printValues(jvmStrings->getDataAsStringArray(), 6);
294        std::cout << "]" << std::endl;
295
296        delete myBools;
297        delete myBytes;
298        delete myChars;
299        delete myDoubles;
300        delete myFloats;
301        delete myInts;
302        delete myShorts;
303        delete myLongs;
304
305        // exec commands
306        std::cout << "TestC2: trying some exec calls" << std::endl;
307        p->exec("import java.awt.BorderLayout");
308        p->exec("import javax.swing.JButton");
309        p->exec("import javax.swing.JFrame");
310        p->exec("import javax.swing.JPanel");
311        p->exec("frame = new JFrame(\"My Java Frame\")");
312        p->exec("pane = new JPanel()");
313        p->exec("frame.setContentPane(pane)");
314        p->exec("layout = new BorderLayout()");
315        p->exec("pane.setLayout(layout)");
316        p->exec("button = new JButton(\"Hello world!\")");
317        p->exec("pane.add(button, BorderLayout.CENTER)");
318        p->exec("frame.setBounds(100, 100, 500, 400)");
319        p->exec("frame.setVisible(true)");
320
321        // large Byte array
322        const int big = 10000000;
323        Byte* largeBytes = new Byte[big];
324        for (int i=0; i<big; i++) largeBytes[i] = randomByte();
325
326        p->setVar("largeBytes", largeBytes, big);
327        std::cout << "TestC2: setVar: largeBytes -> [";
328        printValues(largeBytes, 0, 3);
329        std::cout << " ...";
330        printValues(largeBytes, big / 2 - 1, 3);
331        std::cout << " ...";
332        printValues(largeBytes, big - 3, 3);
333        std::cout << " ]" << std::endl;
334        std::auto_ptr<JVMLinkObject> jvmLargeBytes(p->getVar("largeBytes"));
335        std::cout << "TestC2: getVar: largeBytes == [";
336        Byte* largeBytes2 = jvmLargeBytes->getDataAsByteArray();
337        printValues(largeBytes2, 0, 3);
338        std::cout << " ...";
339        printValues(largeBytes2, big / 2 - 1, 3);
340        std::cout << " ...";
341        printValues(largeBytes2, big - 3, 3);
342        std::cout << " ]" << std::endl;
343
344        delete largeBytes;
345
346        std::cout << std::endl << std::endl << "Press enter to shut down the server and exit..." << std::endl;
347#ifdef _WIN32
348        _fgetchar();
349#else
350        getchar();
351#endif
352
353        // free Java resources
354        p->exec("frame.dispose()");
355
356        // order the server to shut down
357        p->shutJava();
358
359        // close our connection to the server
360        p->closeConnection();
361
362        // free local resources
363        delete(p);
364
365        return 0;
366}
Note: See TracBrowser for help on using the repository browser.