1 /* 2 ** Copyright 2011, The Android Open Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.gldebugger; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertNotNull; 21 import static org.junit.Assert.assertNull; 22 23 import com.android.ide.eclipse.gldebugger.MessageQueue; 24 import com.android.ide.eclipse.gldebugger.ProcessMessage; 25 import com.android.ide.eclipse.gldebugger.DebuggerMessage.Message; 26 import com.android.ide.eclipse.gldebugger.DebuggerMessage.Message.Function; 27 import com.android.ide.eclipse.gldebugger.DebuggerMessage.Message.Type; 28 29 import org.junit.Before; 30 import org.junit.Test; 31 32 import java.io.DataOutputStream; 33 import java.io.File; 34 import java.io.FileInputStream; 35 import java.io.FileNotFoundException; 36 import java.io.FileOutputStream; 37 import java.io.IOException; 38 import java.nio.ByteOrder; 39 40 public class MessageQueueTest { 41 private MessageQueue queue; 42 43 /** 44 * @throws java.lang.Exception 45 */ 46 @Before setUp()47 public void setUp() throws Exception { 48 queue = new MessageQueue(null, new ProcessMessage[0]); 49 } 50 51 /** 52 * Test method for 53 * {@link com.android.ide.eclipse.gldebugger.MessageQueue#defaultProcessMessage(com.android.ide.eclipse.gldebugger.DebuggerMessage.Message, boolean, boolean)} 54 * . 55 * 56 * @throws IOException 57 */ 58 @Test testDefaultProcessMessage()59 public void testDefaultProcessMessage() throws IOException { 60 final int contextId = 8784; 61 assertNull(queue.getPartialMessage(contextId)); 62 Message.Builder builder = Message.newBuilder(); 63 builder.setContextId(contextId); 64 builder.setExpectResponse(false); 65 builder.setFunction(Function.glFinish); 66 builder.setType(Type.BeforeCall); 67 Message msg = builder.build(); 68 queue.defaultProcessMessage(msg, false, false); 69 assertNotNull(queue.getPartialMessage(contextId)); 70 71 builder = msg.toBuilder(); 72 builder.setType(Type.AfterCall); 73 builder.setTime(5); 74 msg = builder.build(); 75 queue.defaultProcessMessage(msg, false, false); 76 assertNull(queue.getPartialMessage(contextId)); 77 Message complete = queue.removeCompleteMessage(contextId); 78 assertNotNull(complete); 79 assertEquals(contextId, complete.getContextId()); 80 assertEquals(msg.getFunction(), complete.getFunction()); 81 assertEquals(msg.getTime(), complete.getTime(), 0); 82 assertEquals(Type.CompleteCall, complete.getType()); 83 84 // an already complete message should just be added to complete queue 85 queue.defaultProcessMessage(complete, false, false); 86 assertNull(queue.getPartialMessage(contextId)); 87 complete = queue.removeCompleteMessage(contextId); 88 assertNotNull(complete); 89 assertEquals(contextId, complete.getContextId()); 90 assertEquals(msg.getFunction(), complete.getFunction()); 91 assertEquals(msg.getTime(), complete.getTime(), 0); 92 assertEquals(Type.CompleteCall, complete.getType()); 93 } 94 95 @Test testCompletePartialMessage()96 public void testCompletePartialMessage() throws IOException { 97 final int contextId = 8784; 98 assertNull(queue.getPartialMessage(contextId)); 99 Message.Builder builder = Message.newBuilder(); 100 builder.setContextId(contextId); 101 builder.setExpectResponse(false); 102 builder.setFunction(Function.glFinish); 103 builder.setType(Type.BeforeCall); 104 Message msg = builder.build(); 105 queue.defaultProcessMessage(msg, false, false); 106 assertNotNull(queue.getPartialMessage(contextId)); 107 queue.completePartialMessage(contextId); 108 109 final Message complete = queue.removeCompleteMessage(contextId); 110 assertNotNull(complete); 111 assertEquals(contextId, complete.getContextId()); 112 assertEquals(msg.getFunction(), complete.getFunction()); 113 assertEquals(msg.getTime(), complete.getTime(), 0); 114 assertEquals(Type.BeforeCall, complete.getType()); 115 } 116 117 /** Write two messages from two contexts to file and test handling them */ 118 @Test testRunWithFile()119 public void testRunWithFile() throws FileNotFoundException, IOException, InterruptedException { 120 final File filePath = File.createTempFile("test", ".gles2dbg"); 121 DataOutputStream file = new DataOutputStream(new FileOutputStream(filePath)); 122 Message.Builder builder = Message.newBuilder(); 123 final int contextId0 = 521643, contextId1 = 87634; 124 assertNull(queue.removeCompleteMessage(contextId0)); 125 assertNull(queue.removeCompleteMessage(contextId1)); 126 127 builder.setContextId(contextId0).setExpectResponse(false).setType(Type.BeforeCall); 128 builder.setFunction(Function.glClear).setArg0(contextId0); 129 Message msg0 = builder.build(); 130 byte[] data = msg0.toByteArray(); 131 file.writeInt(data.length); 132 file.write(data); 133 134 builder = Message.newBuilder(); 135 builder.setContextId(contextId1).setExpectResponse(false).setType(Type.BeforeCall); 136 builder.setFunction(Function.glDisable).setArg0(contextId1); 137 Message msg1 = builder.build(); 138 data = msg1.toByteArray(); 139 file.writeInt(data.length); 140 file.write(data); 141 142 builder = Message.newBuilder(); 143 msg0 = builder.setContextId(msg0.getContextId()).setExpectResponse(false) 144 .setType(Type.AfterCall).setFunction(msg0.getFunction()).setTime(2).build(); 145 data = msg0.toByteArray(); 146 file.writeInt(data.length); 147 file.write(data); 148 149 builder = Message.newBuilder(); 150 msg1 = builder.setContextId(msg1.getContextId()).setExpectResponse(false) 151 .setType(Type.AfterCall).setFunction(msg1.getFunction()).setTime(465).build(); 152 data = msg1.toByteArray(); 153 file.writeInt(data.length); 154 file.write(data); 155 156 file.close(); 157 158 FileInputStream fis = new FileInputStream(filePath); 159 // Java VM uses big endian, so the file was written in big endian 160 queue.start(ByteOrder.BIG_ENDIAN, fis); 161 queue.thread.join(); 162 163 Message complete0 = queue.removeCompleteMessage(msg0.getContextId()); 164 assertNotNull(complete0); 165 assertNull(queue.removeCompleteMessage(contextId0)); 166 assertEquals(contextId0, complete0.getContextId()); 167 assertEquals(false, complete0.getExpectResponse()); 168 assertEquals(Type.CompleteCall, complete0.getType()); 169 assertEquals(msg0.getFunction(), complete0.getFunction()); 170 assertEquals(contextId0, complete0.getArg0()); 171 assertEquals(msg0.getTime(), complete0.getTime(), 0); 172 173 Message complete1 = queue.removeCompleteMessage(msg1.getContextId()); 174 assertNotNull(complete1); 175 assertNull(queue.removeCompleteMessage(contextId1)); 176 assertEquals(contextId1, complete1.getContextId()); 177 assertEquals(false, complete1.getExpectResponse()); 178 assertEquals(Type.CompleteCall, complete1.getType()); 179 assertEquals(msg1.getFunction(), complete1.getFunction()); 180 assertEquals(contextId1, complete1.getArg0()); 181 assertEquals(msg1.getTime(), complete1.getTime(), 0); 182 183 filePath.delete(); 184 } 185 } 186