11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.components.devtools_bridge;
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.net.LocalServerSocket;
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.net.LocalSocket;
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.test.InstrumentationTestCase;
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.test.suitebuilder.annotation.SmallTest;
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport junit.framework.Assert;
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.io.IOException;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.util.concurrent.Future;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Tests for {@link SocketTunnelBridge}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic class LocalTunnelBridgeTest extends InstrumentationTestCase {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private static final String REQUEST = "Request";
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private static final String RESPONSE = "Response";
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private static final String SERVER_SOCKET_NAME =
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            "org.chromium.components.devtools_bridge.LocalTunnelBridgeTest.SERVER_SOCKET";
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private static final String CLIENT_SOCKET_NAME =
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            "org.chromium.components.devtools_bridge.LocalTunnelBridgeTest.CLIENT_SOCKET";
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private LocalTunnelBridge mBridge;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private LocalServerSocket mServerSocket;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @Override
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void setUp() throws Exception {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        super.setUp();
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mServerSocket = new LocalServerSocket(SERVER_SOCKET_NAME);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private void startBridge() throws IOException {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startBridge(SERVER_SOCKET_NAME);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private void startBridge(String serverSocketName) throws IOException {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Assert.assertNull(mBridge);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge = new LocalTunnelBridge(serverSocketName, CLIENT_SOCKET_NAME);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.start();
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @Override
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void tearDown() throws Exception {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        super.tearDown();
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (mBridge != null) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mBridge.dispose();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mBridge = null;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mServerSocket.close();
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testStartStop() throws Exception {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startBridge();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.stop();
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testRequestResponse() throws Exception {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startBridge();
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Future<String> response = TestUtils.asyncRequest(CLIENT_SOCKET_NAME, REQUEST);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        LocalSocket socket = mServerSocket.accept();
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        String request = TestUtils.readAll(socket);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TestUtils.writeAndShutdown(socket, RESPONSE);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Assert.assertEquals(REQUEST, request);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Assert.assertEquals(RESPONSE, response.get());
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        socket.close();
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.stop();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testRequestFailure1() throws Exception {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startBridge();
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Future<String> response = TestUtils.asyncRequest(CLIENT_SOCKET_NAME, REQUEST);
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        LocalSocket socket = mServerSocket.accept();
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int firstByte = socket.getInputStream().read();
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Assert.assertEquals((int) REQUEST.charAt(0), firstByte);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        socket.close();
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Assert.assertEquals("", response.get());
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.waitAllConnectionsClosed();
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.stop();
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testRequestFailure2() throws Exception {
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        startBridge("jdwp-control"); // Android system socket will reject connection.
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Future<String> response = TestUtils.asyncRequest(CLIENT_SOCKET_NAME, REQUEST);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Assert.assertEquals("", response.get());
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.waitAllConnectionsClosed();
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mBridge.stop();
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
112