• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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