PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/xchange-examples/src/test/java/org/knowm/xchange/examples/AllIntegration.java

http://github.com/timmolter/XChange
Java | 215 lines | 157 code | 49 blank | 9 comment | 7 complexity | 1f3d7c8ef5b172f83d55d0014f47d6a6 MD5 | raw file
  1. package org.knowm.xchange.examples;
  2. import static org.assertj.core.api.Assertions.assertThat;
  3. import java.io.IOException;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import java.net.SocketTimeoutException;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.Collection;
  11. import java.util.Collections;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.concurrent.Callable;
  15. import org.junit.Assume;
  16. import org.junit.Before;
  17. import org.junit.Test;
  18. import org.junit.runner.RunWith;
  19. import org.junit.runners.Parameterized;
  20. import org.knowm.xchange.Exchange;
  21. import org.knowm.xchange.ExchangeFactory;
  22. import org.knowm.xchange.currency.Currency;
  23. import org.knowm.xchange.currency.CurrencyPair;
  24. import org.knowm.xchange.dto.meta.CurrencyMetaData;
  25. import org.knowm.xchange.dto.meta.CurrencyPairMetaData;
  26. import org.knowm.xchange.dto.meta.ExchangeMetaData;
  27. import org.knowm.xchange.exceptions.NotAvailableFromExchangeException;
  28. import org.knowm.xchange.exceptions.NotYetImplementedForExchangeException;
  29. import org.knowm.xchange.service.marketdata.MarketDataService;
  30. import org.knowm.xchange.utils.retries.IPredicate;
  31. import org.knowm.xchange.utils.retries.Retries;
  32. import org.reflections.Reflections;
  33. import org.slf4j.Logger;
  34. import org.slf4j.LoggerFactory;
  35. @RunWith(Parameterized.class)
  36. public class AllIntegration {
  37. // Predicate specifies which exceptions indicate to retry the request
  38. public static final IPredicate<Exception> RETRYABLE_REQUEST =
  39. new IPredicate<Exception>() {
  40. @Override
  41. public boolean test(Exception e) {
  42. return (e.getMessage() != null
  43. && e.getMessage().contains("{code=200, message=Too many requests}"))
  44. || e instanceof SocketTimeoutException /*
  45. * || e instanceof HttpStatusIOException
  46. */;
  47. }
  48. };
  49. static final Logger logger = LoggerFactory.getLogger(AllIntegration.class);
  50. @Parameterized.Parameter(0)
  51. public Class<? extends Exchange> exchangeClass;
  52. @Parameterized.Parameter(1)
  53. public String exchangeName;
  54. private Exchange exchange;
  55. @Parameterized.Parameters(name = "{index}:{1}")
  56. public static Iterable<Object[]> data() {
  57. List<Object[]> exchangeClasses = new ArrayList<>();
  58. // Find every Exchange
  59. Reflections reflections = new Reflections("org.knowm.xchange");
  60. for (Class<? extends Exchange> exchangeClass : reflections.getSubTypesOf(Exchange.class)) {
  61. if (Modifier.isAbstract(exchangeClass.getModifiers())) {
  62. continue;
  63. }
  64. exchangeClasses.add(new Object[] {exchangeClass, exchangeClass.getSimpleName()});
  65. }
  66. return exchangeClasses;
  67. }
  68. @Before
  69. public void createExchange() {
  70. exchange = ExchangeFactory.INSTANCE.createExchange(exchangeClass.getName());
  71. assertThat(exchange).isNotNull();
  72. }
  73. @Test
  74. public void testGetMetaData() throws IOException {
  75. exchange.remoteInit();
  76. ExchangeMetaData exchangeMetaData = exchange.getExchangeMetaData();
  77. assertThat(exchangeMetaData).isNotNull();
  78. Map<CurrencyPair, CurrencyPairMetaData> marketMetaDataMap = exchangeMetaData.getCurrencyPairs();
  79. assertThat(marketMetaDataMap).isNotEmpty();
  80. Map<Currency, CurrencyMetaData> currencyMetaDataMap = exchangeMetaData.getCurrencies();
  81. assertThat(currencyMetaDataMap).isNotNull();
  82. }
  83. // Test some service method for a collection of first arguments, catching for example
  84. // NotYetImplementedForExchangeException
  85. private <R, A> Collection<R> testExchangeMethod(
  86. final Object service,
  87. final Method method,
  88. Collection<A> firstArgumentOptions,
  89. Object... restStaticArguments)
  90. throws Throwable {
  91. Assume.assumeNotNull(service);
  92. String methodName = method.getName();
  93. Collection<R> results = new ArrayList<>(firstArgumentOptions.size());
  94. final ArrayList<Object> arguments = new ArrayList<>(restStaticArguments.length + 1);
  95. arguments.add(null);
  96. arguments.addAll(Arrays.asList(restStaticArguments));
  97. // If one argument throws NotAvailableFromExchange, all must.
  98. boolean notAvailableFromExchangeThrown = false;
  99. boolean notAvailableFromExchangeNotThrown = false;
  100. for (final A firstArgument : firstArgumentOptions) {
  101. Callable<R> callMethod =
  102. new Callable<R>() {
  103. @Override
  104. @SuppressWarnings("unchecked")
  105. public R call() throws Exception {
  106. try {
  107. arguments.set(0, firstArgument);
  108. return (R) method.invoke(service, arguments.toArray());
  109. } catch (InvocationTargetException invocationTargetException) {
  110. throw ((Exception) invocationTargetException.getCause());
  111. }
  112. }
  113. };
  114. try {
  115. R result = Retries.callWithRetries(8, 1, callMethod, RETRYABLE_REQUEST);
  116. assertThat(notAvailableFromExchangeThrown).isFalse();
  117. notAvailableFromExchangeNotThrown = true;
  118. String logmsg = methodName + "(" + firstArgument + ") -> " + result;
  119. if (logmsg.length() > 75) {
  120. logmsg = logmsg.substring(0, 75);
  121. }
  122. logger.debug(logmsg);
  123. assertThat(result).isNotNull();
  124. results.add(result);
  125. } catch (NotAvailableFromExchangeException e) {
  126. assertThat(notAvailableFromExchangeNotThrown).isFalse();
  127. notAvailableFromExchangeThrown = true;
  128. } catch (NotYetImplementedForExchangeException e) {
  129. logger.warn(methodName + " unimplemented");
  130. }
  131. }
  132. Assume.assumeFalse(methodName + " not available from exchange", notAvailableFromExchangeThrown);
  133. return results;
  134. }
  135. // Returns collection of currency pairs
  136. private Collection<CurrencyPair> getCurrencyPairs() throws IOException {
  137. exchange.remoteInit();
  138. Assume.assumeNotNull(exchange.getExchangeMetaData());
  139. Assume.assumeNotNull(exchange.getExchangeMetaData().getCurrencyPairs());
  140. // uncomment to test every single currencypair
  141. // return exchange.getMetaData().getMarketMetaDataMap().keySet();
  142. return Collections.singletonList(
  143. exchange.getExchangeMetaData().getCurrencyPairs().keySet().iterator().next());
  144. }
  145. @Test
  146. public void testGetTicker() throws Throwable {
  147. Method method =
  148. MarketDataService.class.getMethod("getTicker", CurrencyPair.class, Object[].class);
  149. testExchangeMethod(
  150. exchange.getMarketDataService(), method, getCurrencyPairs(), (Object) new Object[] {});
  151. }
  152. @Test
  153. public void testGetOrderBook() throws Throwable {
  154. Method method =
  155. MarketDataService.class.getMethod("getOrderBook", CurrencyPair.class, Object[].class);
  156. testExchangeMethod(
  157. exchange.getMarketDataService(), method, getCurrencyPairs(), (Object) new Object[] {});
  158. }
  159. @Test
  160. public void testGetTrades() throws Throwable {
  161. Method method =
  162. MarketDataService.class.getMethod("getTrades", CurrencyPair.class, Object[].class);
  163. testExchangeMethod(
  164. exchange.getMarketDataService(), method, getCurrencyPairs(), (Object) new Object[] {});
  165. }
  166. }