content: /*
   * Copyright (C) 2013 4th Line GmbH, Switzerland
   *
   * The contents of this file are subject to the terms of either the GNU
   * Lesser General Public License Version 2 or later ("LGPL") or the
   * Common Development and Distribution License Version 1 or later
   * ("CDDL") (collectively, the "License"). You may not use this file
   * except in compliance with the License. See LICENSE.txt for more
   * information.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
   */
  package org.fourthline.cling.mock;
  
  import org.fourthline.cling.UpnpServiceConfiguration;
  import org.fourthline.cling.model.NetworkAddress;
  import org.fourthline.cling.model.message.IncomingDatagramMessage;
  import org.fourthline.cling.model.message.OutgoingDatagramMessage;
  import org.fourthline.cling.model.message.StreamRequestMessage;
  import org.fourthline.cling.model.message.StreamResponseMessage;
  import org.fourthline.cling.protocol.ProtocolFactory;
  import org.fourthline.cling.transport.Router;
  import org.fourthline.cling.transport.RouterException;
  import org.fourthline.cling.transport.impl.NetworkAddressFactoryImpl;
  import org.fourthline.cling.transport.spi.InitializationException;
  import org.fourthline.cling.transport.spi.NetworkAddressFactory;
  import org.fourthline.cling.transport.spi.UpnpStream;
  
  import javax.enterprise.inject.Alternative;
  import java.net.InetAddress;
  import java.net.UnknownHostException;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  
  /**
   * <p>
   * This is not a real network transport layer, it collects all messages instead and makes
   * them available for testing with {@link #getOutgoingDatagramMessages()},
   * {@link #getSentStreamRequestMessages()}, etc. Mock responses for TCP (HTTP) stream requests
   * can be returned by overriding {@link #getStreamResponseMessage(org.fourthline.cling.model.message.StreamRequestMessage)}
   * or {@link #getStreamResponseMessages()} if you know the order of requests.
   * </p>
   *
   * @author Christian Bauer
   */
  @Alternative
  public class MockRouter implements Router {
  
      public int counter = -1;
      public List<IncomingDatagramMessage> incomingDatagramMessages = new ArrayList<>();
      public List<OutgoingDatagramMessage> outgoingDatagramMessages = new ArrayList<>();
      public List<UpnpStream> receivedUpnpStreams = new ArrayList<>();
      public List<StreamRequestMessage> sentStreamRequestMessages = new ArrayList<>();
      public List<byte[]> broadcastedBytes = new ArrayList<>();
  
      protected UpnpServiceConfiguration configuration;
      protected ProtocolFactory protocolFactory;
  
      public MockRouter(UpnpServiceConfiguration configuration,
                        ProtocolFactory protocolFactory) {
          this.configuration = configuration;
          this.protocolFactory = protocolFactory;
      }
  
      @Override
      public UpnpServiceConfiguration getConfiguration() {
          return configuration;
      }
  
      @Override
      public ProtocolFactory getProtocolFactory() {
          return protocolFactory;
      }
  
      @Override
      public boolean enable() throws RouterException {
          return false;
      }
  
      @Override
      public boolean disable() throws RouterException {
          return false;
      }
  
      @Override
      public void shutdown() throws RouterException {
      }
  
      @Override
      public boolean isEnabled() throws RouterException {
          return false;
      }
  
      @Override
      public void handleStartFailure(InitializationException ex) throws InitializationException {
      }
  
      @Override
      public List<NetworkAddress> getActiveStreamServers(InetAddress preferredAddress) throws RouterException {
          // Simulate an active stream server, otherwise the notification/search response
          // protocols won't even run
          try {
              return Arrays.asList(
                  new NetworkAddress(
                      InetAddress.getByName("127.0.0.1"),
                      NetworkAddressFactoryImpl.DEFAULT_TCP_HTTP_LISTEN_PORT
                  )
              );
          } catch (UnknownHostException ex) {
              throw new RuntimeException(ex);
          }
      }
  
      public void received(IncomingDatagramMessage msg) {
          incomingDatagramMessages.add(msg);
      }
  
      public void received(UpnpStream stream) {
          receivedUpnpStreams.add(stream);
      }
  
      public void send(OutgoingDatagramMessage msg) throws RouterException {
          outgoingDatagramMessages.add(msg);
      }
  
      public StreamResponseMessage send(StreamRequestMessage msg) throws RouterException {
          sentStreamRequestMessages.add(msg);
          counter++;
          return getStreamResponseMessages() != null
              ? getStreamResponseMessages()[counter]
              : getStreamResponseMessage(msg);
      }
  
      public void broadcast(byte[] bytes) {
          broadcastedBytes.add(bytes);
      }
  
      public void resetStreamRequestMessageCounter() {
          counter = -1;
      }
  
      public List<IncomingDatagramMessage> getIncomingDatagramMessages() {
          return incomingDatagramMessages;
      }
  
      public List<OutgoingDatagramMessage> getOutgoingDatagramMessages() {
          return outgoingDatagramMessages;
      }
  
      public List<UpnpStream> getReceivedUpnpStreams() {
          return receivedUpnpStreams;
      }
  
      public List<StreamRequestMessage> getSentStreamRequestMessages() {
          return sentStreamRequestMessages;
      }
  
      public List<byte[]> getBroadcastedBytes() {
          return broadcastedBytes;
      }
  
      public StreamResponseMessage[] getStreamResponseMessages() {
          return null;
      }
  
      public StreamResponseMessage getStreamResponseMessage(StreamRequestMessage request) {
          return null;
      }
  
  }
  