aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test-extensions/sun/applet/mock/PluginPipeMock.java
blob: 2435c66046b7be4918b0a343f23b2ea7b2b75c10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package sun.applet.mock;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Helper for getting an input & output stream for use with PluginStreamHandler.
 * Provides a convenient way of reading the Java requests and sending mocked
 * plugin responses.
 * 
 * The handling of these requests should be done on a different thread from the
 * tested method, as icedtea-web will block waiting for a reply after sending a
 * request.
 */
public class PluginPipeMock {
    private ResponseInputPipeMock responseInputStream = new ResponseInputPipeMock();
    private RequestOutputPipeMock requestOutputStream = new RequestOutputPipeMock();

    /*
     * A queue of mocked responses that are sent as replies to icedtea-web
     * Java-side requests.
     */
    private BlockingQueue<String> mockedResponseQueue = new LinkedBlockingQueue<String>();

    /*
     * A queue of actual (ie, not mocked) requests that come from methods
     * under test.
     */
    private BlockingQueue<String> requestQueue = new LinkedBlockingQueue<String>();

    public InputStream getResponseInputStream() {
        return responseInputStream;
    }

    public OutputStream getRequestOutputStream() {
        return requestOutputStream;
    }

    public String getNextRequest() {
        try {
            return requestQueue.take();
        } catch (InterruptedException e) {
            // Nothing to do
            return null;
        }
    }

    public void sendResponse(String response) {
        try {
            mockedResponseQueue.put(response);
        } catch (InterruptedException e) {
            // Nothing to do
        }
    }

    /**
     * Queues mocked responses and sends them as replies to icedtea-web. A
     * synchronized message queue is read from. Blocks until it gets the next
     * message.
     */
    private class ResponseInputPipeMock extends InputStream {
        private StringReader reader = null;

        @Override
        public int read() throws IOException {
            try {
                while (true) {
                    if (reader == null) {
                        reader = new StringReader(mockedResponseQueue.take() + '\n');
                    }
                    int chr = reader.read();
                    if (chr == -1) {
                        reader = null;
                        continue;
                    }
                    return chr;
                }
            } catch (InterruptedException e) {
                // Nothing to do
                return -1;
            }
        }

        /* Necessary for correct behaviour with BufferedReader! */
        @Override
        public int read(byte b[], int off, int len) throws IOException {
            if (len == 0) {
                return 0;
            }
            b[off] = (byte) read();
            return 1;
        }
    }

    /**
     * Outputs requests from icedtea-web as a stream of lines. A synchronized
     * message queue is written to.
     */
    private class RequestOutputPipeMock extends OutputStream {
        private StringBuilder lineBuffer = new StringBuilder();

        @Override
        public synchronized void write(int b) throws IOException {
            try {
                char chr = (char) b;
                if (chr == '\0') {
                    requestQueue.put(lineBuffer.toString());
                    lineBuffer.setLength(0);
                } else {
                    lineBuffer.append((char) b);
                }
            } catch (InterruptedException e) {
                // Nothing to do
            }
        }
    }
}