17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.io;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull;
207dd252788645e940eada959bdde927426e2531c9Paul Duffin
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ImmutableList;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ImmutableMap;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Lists;
247dd252788645e940eada959bdde927426e2531c9Paul Duffin
250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
260888a09821a98ac0680fad765217302858e70fa4Paul Duffin
277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.io.IOException;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.io.Reader;
297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.io.StringReader;
307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.lang.reflect.Method;
317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.lang.reflect.Modifier;
327dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List;
337dd252788645e940eada959bdde927426e2531c9Paul Duffin
347dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
357dd252788645e940eada959bdde927426e2531c9Paul Duffin * @param <S> the source or sink type
367dd252788645e940eada959bdde927426e2531c9Paul Duffin * @param <T> the data type (byte[] or String)
377dd252788645e940eada959bdde927426e2531c9Paul Duffin * @param <F> the factory type
387dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Colin Decker
397dd252788645e940eada959bdde927426e2531c9Paul Duffin */
407dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic class SourceSinkTester<S, T, F extends SourceSinkFactory<S, T>> extends TestCase {
417dd252788645e940eada959bdde927426e2531c9Paul Duffin
427dd252788645e940eada959bdde927426e2531c9Paul Duffin  static final String LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing "
437dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "elit. Cras fringilla elit ac ipsum adipiscing vulputate. Maecenas in lorem nulla, ac "
447dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "sollicitudin quam. Praesent neque elit, sodales quis vestibulum vel, pellentesque nec "
457dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "erat. Proin cursus commodo lacus eget congue. Aliquam erat volutpat. Fusce ut leo sed "
467dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "risus tempor vehicula et a odio. Nam aliquet dolor viverra libero rutrum accumsan quis "
477dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "in augue. Suspendisse id dui in lorem tristique placerat eget vel risus. Sed metus neque, "
487dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "scelerisque in molestie ac, mattis quis lectus. Pellentesque viverra justo commodo quam "
497dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "bibendum ut gravida leo accumsan. Nullam malesuada sagittis diam, quis suscipit mauris "
507dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "euismod vulputate. Pellentesque ultrices tellus sed lorem aliquet pulvinar. Nam lorem "
517dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "nunc, ultrices at auctor non, scelerisque eget turpis. Nullam eget varius erat. Sed a "
527dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "lorem id arcu dictum euismod. Fusce lectus odio, elementum ullamcorper mattis viverra, "
537dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "dictum sit amet lacus.\n"
547dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "\n"
557dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "Nunc quis lacus est. Sed aliquam pretium cursus. Sed eu libero eros. In hac habitasse "
567dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "platea dictumst. Pellentesque molestie, nibh nec iaculis luctus, justo sem lobortis enim, "
577dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "at feugiat leo magna nec libero. Mauris quis odio eget nisl rutrum cursus nec eget augue. "
587dd252788645e940eada959bdde927426e2531c9Paul Duffin      + "Sed nec arcu sem. In hac habitasse platea dictumst.";
597dd252788645e940eada959bdde927426e2531c9Paul Duffin
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  static final ImmutableMap<String, String> TEST_STRINGS
617dd252788645e940eada959bdde927426e2531c9Paul Duffin      = ImmutableMap.<String, String>builder()
627dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("empty", "")
637dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("1 char", "0")
647dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("1 word", "hello")
657dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("2 words", "hello world")
667dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("\\n line break", "hello\nworld")
677dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("\\r line break", "hello\rworld")
687dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("\\r\\n line break", "hello\r\nworld")
697dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("\\n at EOF", "hello\nworld\n")
707dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("\\r at EOF", "hello\nworld\r")
717dd252788645e940eada959bdde927426e2531c9Paul Duffin      .put("lorem ipsum", LOREM_IPSUM)
727dd252788645e940eada959bdde927426e2531c9Paul Duffin      .build();
737dd252788645e940eada959bdde927426e2531c9Paul Duffin
747dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected final F factory;
757dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected final T data;
767dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected final T expected;
777dd252788645e940eada959bdde927426e2531c9Paul Duffin
787dd252788645e940eada959bdde927426e2531c9Paul Duffin  private final String suiteName;
797dd252788645e940eada959bdde927426e2531c9Paul Duffin  private final String caseDesc;
807dd252788645e940eada959bdde927426e2531c9Paul Duffin
817dd252788645e940eada959bdde927426e2531c9Paul Duffin  SourceSinkTester(F factory, T data, String suiteName, String caseDesc, Method method) {
827dd252788645e940eada959bdde927426e2531c9Paul Duffin    super(method.getName());
837dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.factory = checkNotNull(factory);
847dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.data = checkNotNull(data);
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.expected = checkNotNull(factory.getExpected(data));
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.suiteName = checkNotNull(suiteName);
877dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.caseDesc = checkNotNull(caseDesc);
887dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
897dd252788645e940eada959bdde927426e2531c9Paul Duffin
907dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override
917dd252788645e940eada959bdde927426e2531c9Paul Duffin  public String getName() {
927dd252788645e940eada959bdde927426e2531c9Paul Duffin    return super.getName() + " [" + suiteName + " [" + caseDesc + "]]";
937dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
947dd252788645e940eada959bdde927426e2531c9Paul Duffin
957dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected static ImmutableList<String> getLines(final String string) {
967dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new CharSource() {
987dd252788645e940eada959bdde927426e2531c9Paul Duffin        @Override
997dd252788645e940eada959bdde927426e2531c9Paul Duffin        public Reader openStream() throws IOException {
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin          return new StringReader(string);
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin      }.readLines();
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (IOException e) {
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin      throw new AssertionError();
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void tearDown() throws IOException {
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin    factory.tearDown();
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin  static ImmutableList<Method> getTestMethods(Class<?> testClass) {
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin    List<Method> result = Lists.newArrayList();
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (Method method : testClass.getDeclaredMethods()) {
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin      if (Modifier.isPublic(method.getModifiers())
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin          && method.getReturnType() == void.class
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin          && method.getParameterTypes().length == 0
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin          && method.getName().startsWith("test")) {
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin        result.add(method);
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin    return ImmutableList.copyOf(result);
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin}
126