1 4 package com.tcverify; 5 6 import org.apache.commons.lang.ArrayUtils; 7 8 import com.tc.config.schema.builder.InstrumentedClassConfigBuilder; 9 import com.tc.config.schema.builder.LockConfigBuilder; 10 import com.tc.config.schema.builder.RootConfigBuilder; 11 import com.tc.config.schema.setup.FatalIllegalConfigurationChangeHandler; 12 import com.tc.config.schema.setup.StandardTVSConfigurationSetupManagerFactory; 13 import com.tc.config.schema.setup.TVSConfigurationSetupManagerFactory; 14 import com.tc.config.schema.test.InstrumentedClassConfigBuilderImpl; 15 import com.tc.config.schema.test.L2ConfigBuilder; 16 import com.tc.config.schema.test.LockConfigBuilderImpl; 17 import com.tc.config.schema.test.RootConfigBuilderImpl; 18 import com.tc.config.schema.test.TerracottaConfigBuilder; 19 import com.tc.process.LinkedJavaProcess; 20 import com.tc.process.StreamCollector; 21 import com.tc.server.TCServerImpl; 22 import com.tc.test.TCTestCase; 23 import com.tc.test.TestConfigObject; 24 import com.tc.util.PortChooser; 25 26 import java.io.BufferedReader ; 27 import java.io.File ; 28 import java.io.FileWriter ; 29 import java.io.IOException ; 30 import java.io.StringReader ; 31 32 35 public class DSOVerifierTest extends TCTestCase { 36 37 TCServerImpl server; 38 39 public final static void main(String [] args) throws Exception { 40 DSOVerifierTest t = new DSOVerifierTest(); 41 t.setUp(); 42 t.test(); 43 t.tearDown(); 44 } 45 46 public DSOVerifierTest() { 47 } 49 50 protected void setUp() throws Exception { 51 super.setUp(); 52 53 File configFile = writeConfigFile(); 54 55 StandardTVSConfigurationSetupManagerFactory config; 56 config = new StandardTVSConfigurationSetupManagerFactory(new String [] { 57 StandardTVSConfigurationSetupManagerFactory.CONFIG_SPEC_ARGUMENT_WORD, configFile.getAbsolutePath() }, true, 58 new FatalIllegalConfigurationChangeHandler()); 59 60 server = new TCServerImpl(config.createL2TVSConfigurationSetupManager(null)); 61 server.start(); 62 } 63 64 protected void tearDown() throws Exception { 65 if (server != null) { 66 server.stop(); 67 } 68 super.tearDown(); 69 } 70 71 private boolean verifyOutput(String output, String desiredPrefix) throws IOException { 72 BufferedReader reader = new BufferedReader (new StringReader (output)); 73 74 String line; 75 while ((line = reader.readLine()) != null) { 76 if (line.startsWith(desiredPrefix)) { return true; } 77 } 78 79 return false; 80 } 81 82 public void test() throws Exception { 83 String bootclasspath = "-Xbootclasspath/p:" + TestConfigObject.getInstance().normalBootJar(); 84 85 System.out.println("Bootclasspath:" + bootclasspath); 86 87 String [] jvmArgs = new String [] { 88 bootclasspath, 89 "-D" + TVSConfigurationSetupManagerFactory.CONFIG_FILE_PROPERTY_NAME + "=localhost:" 90 + server.getDSOListenPort() }; 91 System.out.println("JVM args: " + ArrayUtils.toString(jvmArgs)); 92 93 LinkedJavaProcess p1 = new LinkedJavaProcess(DSOVerifier.class.getName(), new String [] { "1", "2" }); 94 p1.setJavaArguments(jvmArgs); 95 p1.setDSOTarget(true); 96 97 LinkedJavaProcess p2 = new LinkedJavaProcess(DSOVerifier.class.getName(), new String [] { "2", "1" }); 98 p2.setJavaArguments(jvmArgs); 99 p2.setDSOTarget(true); 100 101 p1.start(); 102 p2.start(); 103 104 p1.getOutputStream().close(); 105 p2.getOutputStream().close(); 106 107 StreamCollector p1StdOut = new StreamCollector(p1.getInputStream()); 108 StreamCollector p2StdOut = new StreamCollector(p2.getInputStream()); 109 StreamCollector p1StdErr = new StreamCollector(p1.getErrorStream()); 110 StreamCollector p2StdErr = new StreamCollector(p2.getErrorStream()); 111 p1StdOut.start(); 112 p1StdErr.start(); 113 p2StdOut.start(); 114 p2StdErr.start(); 115 116 p1.waitFor(); 117 p2.waitFor(); 118 119 p1StdOut.join(); 120 p1StdErr.join(); 121 p2StdOut.join(); 122 p2StdErr.join(); 123 124 String p1Out = p1StdOut.toString(); 125 String p2Out = p2StdOut.toString(); 126 String p1Err = p1StdErr.toString(); 127 String p2Err = p2StdErr.toString(); 128 129 String compound = "Process 1 output:\n\n" + p1Out + "\n\nProcess 1 error:\n\n" + p1Err 130 + "\n\nProcess 2 output:\n\n" + p2Out + "\n\nProcess 2 error:\n\n" + p2Err + "\n\n"; 131 132 String output = "L2-DSO-OK:"; 133 if (!verifyOutput(p1Out, output)) { 134 fail(compound); 135 } 136 137 if (!verifyOutput(p2Out, output)) { 138 fail(compound); 139 } 140 } 141 142 private File writeConfigFile() throws IOException { 143 TerracottaConfigBuilder config = TerracottaConfigBuilder.newMinimalInstance(); 144 145 PortChooser portChooser = new PortChooser(); 146 L2ConfigBuilder l2Builder = L2ConfigBuilder.newMinimalInstance(); 147 l2Builder.setDSOPort(portChooser.chooseRandomPort()); 148 l2Builder.setJMXPort(portChooser.chooseRandomPort()); 149 l2Builder.setName("localhost"); 150 151 config.getServers().setL2s(new L2ConfigBuilder[] { l2Builder }); 152 153 InstrumentedClassConfigBuilder instrumentedClass = new InstrumentedClassConfigBuilderImpl(); 154 instrumentedClass.setClassExpression("com.tcverify..*"); 155 config.getApplication().getDSO().setInstrumentedClasses(new InstrumentedClassConfigBuilder[] { instrumentedClass }); 156 157 LockConfigBuilder lock1 = new LockConfigBuilderImpl(LockConfigBuilder.TAG_NAMED_LOCK); 158 lock1.setMethodExpression("java.lang.Object com.tcverify.DSOVerifier.getValue(int)"); 159 lock1.setLockName("verifierMap"); 160 lock1.setLockLevel(LockConfigBuilder.LEVEL_WRITE); 161 162 LockConfigBuilder lock2 = new LockConfigBuilderImpl(LockConfigBuilder.TAG_NAMED_LOCK); 163 lock2.setMethodExpression("void com.tcverify.DSOVerifier.setValue(int)"); 164 lock2.setLockName("verifierMap"); 165 lock2.setLockLevel(LockConfigBuilder.LEVEL_WRITE); 166 167 config.getApplication().getDSO().setLocks(new LockConfigBuilder[] { lock1, lock2 }); 168 169 RootConfigBuilder root = new RootConfigBuilderImpl(); 170 root.setFieldName("com.tcverify.DSOVerifier.verifierMap"); 171 root.setRootName("verifierMap"); 172 173 config.getApplication().getDSO().setRoots(new RootConfigBuilder[] { root }); 174 175 File configDir = this.getTempDirectory(); 176 File configFile = new File (configDir, "dso-verifier-config.xml"); 177 FileWriter cfgOut = new FileWriter (configFile); 178 cfgOut.write(config.toString()); 179 cfgOut.flush(); 180 cfgOut.close(); 181 return configFile; 182 } 183 } 184 | Popular Tags |