1c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller/*
2c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * Copyright (C) 2014 Square, Inc.
3c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller *
4c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
5c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * you may not use this file except in compliance with the License.
6c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * You may obtain a copy of the License at
7c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller *
8c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
9c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller *
10c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * Unless required by applicable law or agreed to in writing, software
11c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
12c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * See the License for the specific language governing permissions and
14c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller * limitations under the License.
15c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller */
16c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerpackage okio;
17c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
18c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport java.io.IOException;
19c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport java.util.ArrayList;
20c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport java.util.Arrays;
21c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport java.util.LinkedHashMap;
22c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport java.util.List;
23c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport java.util.Map;
24c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
25c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport static org.junit.Assert.assertEquals;
26c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport static org.junit.Assert.assertTrue;
27c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
28c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller/** A scriptable sink. Like Mockito, but worse and requiring less configuration. */
29c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerclass MockSink implements Sink {
30c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  private final List<String> log = new ArrayList<String>();
31c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  private final Map<Integer, IOException> callThrows = new LinkedHashMap<Integer, IOException>();
32c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
33c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  public void assertLog(String... messages) {
34c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals(Arrays.asList(messages), log);
35c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
36c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
37c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  public void assertLogContains(String message) {
38c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertTrue(log.contains(message));
39c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
40c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
41c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  public void scheduleThrow(int call, IOException e) {
42c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    callThrows.put(call, e);
43c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
44c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
45c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  private void throwIfScheduled() throws IOException {
46c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    IOException exception = callThrows.get(log.size() - 1);
47c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    if (exception != null) throw exception;
48c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
49c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
50c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  @Override public void write(OkBuffer source, long byteCount) throws IOException {
51c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    log.add("write(" + source + ", " + byteCount + ")");
52c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    source.skip(byteCount);
53c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    throwIfScheduled();
54c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
55c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
56c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  @Override public void flush() throws IOException {
57c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    log.add("flush()");
58c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    throwIfScheduled();
59c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
60c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
61c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  @Override public Sink deadline(Deadline deadline) {
62c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    log.add("deadline()");
63c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    return this;
64c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
65c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller
66c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  @Override public void close() throws IOException {
67c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    log.add("close()");
68c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    throwIfScheduled();
69c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller  }
70c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller}
71