CSControl.java
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:7k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2009, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. package org.jboss.blacktie.jatmibroker.xatmi;
  19. import java.io.*;
  20. import junit.framework.TestCase;
  21. import org.apache.log4j.LogManager;
  22. import org.apache.log4j.Logger;
  23. public abstract class CSControl extends TestCase
  24. {
  25. static final Logger log = LogManager.getLogger(CSControl.class);
  26. // the byte pattern written by a server to indicate that it has advertised its services
  27. private static final byte[] HANDSHAKE = {83,69,82,86,73,67,69,83,32,82,69,65,68,89};
  28. private ProcessBuilder serverBuilder;
  29. private ProcessBuilder clientBuilder;
  30. private TestProcess server;
  31. private TestProcess client;
  32. private String CS_EXE;
  33. private String REPORT_DIR;
  34. private static int sid = 1;
  35. static String nextSid() {
  36. return Integer.toString(sid % 10);
  37. }
  38. public void tearDown() {
  39. try {
  40. log.debug("destroying server process");
  41. server.interrupt();
  42. server.getProcess().destroy();
  43. log.debug("destroyed server process");
  44. server.getProcess().waitFor();
  45. log.debug("waited for server process");
  46. } catch(Throwable e) {
  47. throw new RuntimeException("Server shutdown error: ", e);
  48. }
  49. }
  50. public void setUp() {
  51. log.debug("setup server process");
  52. REPORT_DIR = System.getProperty("TEST_REPORTS_DIR", ".");
  53. CS_EXE = System.getProperty("CLIENT_SERVER_EXE", "./cs");
  54. clientBuilder = new ProcessBuilder();
  55. serverBuilder = new ProcessBuilder();
  56. //clientBuilder.redirectErrorStream(true);
  57. //serverBuilder.redirectErrorStream(true);
  58. java.util.Map<String, String> environment = serverBuilder.environment();
  59. //environment.clear();
  60. environment.put("LD_LIBRARY_PATH", System.getenv("LD_LIBRARY_PATH"));
  61. environment.put("BLACKTIE_CONFIGURATION_DIR", System.getenv("BLACKTIE_CONFIGURATION_DIR"));
  62. environment.put("BLACKTIE_SCHEMA_DIR", System.getenv("BLACKTIE_SCHEMA_DIR"));
  63. environment.put("JBOSSAS_IP_ADDR", System.getenv("JBOSSAS_IP_ADDR"));
  64. environment.put("PATH", System.getenv("PATH"));
  65. clientBuilder.environment().putAll(environment);
  66. serverBuilder.command(CS_EXE, "-c", "linux", "-i", nextSid());
  67. try {
  68. log.debug("start server process");
  69. server = startServer(serverBuilder);
  70. } catch (IOException e) {
  71. throw new RuntimeException("Server io exception: ", e);
  72. } catch (InterruptedException e) {
  73. throw new RuntimeException("Server interrupted: ", e);
  74. }
  75. }
  76. public void runTest(String name) {
  77. try {
  78. log.debug("waiting for test " + name);
  79. clientBuilder.command(CS_EXE, name);
  80. TestProcess client = startClient(name, clientBuilder);
  81. int res = client.exitValue();
  82. log.info("test " + name + (res == 0 ? " passed " : " failed ") + res);
  83. assertTrue(res == 0);
  84. } catch (IOException e) {
  85. throw new RuntimeException(e);
  86. } catch (InterruptedException e) {
  87. throw new RuntimeException(e);
  88. }
  89. }
  90. private TestProcess startClient(String testname, ProcessBuilder builder) throws IOException, InterruptedException {
  91. FileOutputStream ostream = new FileOutputStream(REPORT_DIR + "/test-" + testname + "-out.txt");
  92. FileOutputStream estream = new FileOutputStream(REPORT_DIR + "/test-" + testname + "-err.txt");
  93. TestProcess client = new TestProcess(ostream, estream, "client", builder);
  94. Thread thread = new Thread(client);
  95. thread.start();
  96. log.debug("startClient: waiting to join with client thread ...");
  97. thread.join();
  98. log.debug("startClient: joined - waiting for client process to exit");
  99. client.getProcess().waitFor();
  100. log.debug("startClient: done");
  101. return client;
  102. }
  103. private TestProcess startServer(ProcessBuilder builder) throws IOException, InterruptedException {
  104. FileOutputStream ostream = new FileOutputStream(REPORT_DIR + "/server-out.txt");
  105. FileOutputStream estream = new FileOutputStream(REPORT_DIR + "/server-err.txt");
  106. TestProcess server = new TestProcess(ostream, estream, "server", builder);
  107. Thread thread = new Thread(server);
  108. synchronized (server) {
  109. // start the C server and wait for it to indicate that it has advertised its services
  110. thread.start();
  111. log.debug("startServer waiting for process to finish ...");
  112. server.wait();
  113. }
  114. return server;
  115. }
  116. class TestProcess implements Runnable {
  117. private String type;
  118. private Process proc;
  119. private FileOutputStream ostream;
  120. private FileOutputStream estream;
  121. private Thread thread;
  122. private ProcessBuilder builder;
  123. TestProcess(FileOutputStream ostream, FileOutputStream estream, String type, ProcessBuilder builder) {
  124. this.ostream = ostream;
  125. this.estream = estream;
  126. this.type = type;
  127. this.builder = builder;
  128. }
  129. Process getProcess() { return proc; }
  130. int exitValue() { return proc.exitValue(); }
  131. void interrupt() { if (thread != null) thread.interrupt(); }
  132. public void run() {
  133. thread = Thread.currentThread();
  134. try {
  135. proc = builder.start();
  136. InputStream is = proc.getInputStream();
  137. InputStream es = proc.getErrorStream();
  138. byte[] buf = new byte[1024];
  139. int len;
  140. int match = -1;
  141. /*
  142.  * redirect the process I/O to a file - if it is a server then notify any waiters when the server
  143.  * outputs a magic sequence indicating that it has advertised its services
  144.  */
  145. if ("server".equals(type)) {
  146. // assume the HANDSHAKE sequence can be read in one go
  147. /*
  148. while ((len = is.read(buf)) > 0) {
  149. if (match == -1 && (match = KMPMatch.indexOf(buf, HANDSHAKE, len)) != -1) {
  150. synchronized (this) { this.notify(); }
  151. }
  152. ostream.write(buf, 0, len);
  153. }
  154. */
  155. log.debug("server monitoring process I/O ...");
  156. int pos = 0;
  157. while ((len = is.read(buf, pos, buf.length - pos)) > 0) {
  158. ostream.write(buf, pos, len);
  159. if (match == -1) {
  160. pos += len;
  161. if ((match = KMPMatch.indexOf(buf, HANDSHAKE, pos)) != -1) {
  162. synchronized (this) { this.notify(); }
  163. pos = 0;
  164. } else if (pos == buf.length) {
  165. ostream.write("missing synchronization sequence from service - force notify".getBytes("UTF-8"));
  166. log.warn("missing synchronization sequence from service");
  167. synchronized (this) { this.notify(); }
  168. pos = 0;
  169. match = 0;
  170. }
  171. } else {
  172. pos = 0;
  173. }
  174. }
  175. } else {
  176. while ((len = is.read(buf)) > 0)
  177. ostream.write(buf, 0, len);
  178. }
  179. while ((len = es.read(buf)) > 0)
  180. estream.write(buf, 0, len);
  181. } catch (IOException e) {
  182. if (!thread.interrupted())
  183. log.warn(builder.command() + ": IO error on stream write: " + e);
  184. }
  185. log.debug("server process: read termination byte sequence");
  186. try {
  187. ostream.close();
  188. estream.close();
  189. } catch (IOException e) {
  190. }
  191. }
  192. }
  193. }