1   /*
2    * $Id: FileConnectorTestCase.java 12325 2008-07-13 20:49:42Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.file;
12  
13  import org.mule.api.endpoint.EndpointBuilder;
14  import org.mule.api.endpoint.InboundEndpoint;
15  import org.mule.api.endpoint.OutboundEndpoint;
16  import org.mule.api.lifecycle.InitialisationException;
17  import org.mule.api.service.Service;
18  import org.mule.api.transport.Connector;
19  import org.mule.api.transport.MessageReceiver;
20  import org.mule.endpoint.EndpointURIEndpointBuilder;
21  import org.mule.endpoint.URIBuilder;
22  import org.mule.transport.AbstractConnectorTestCase;
23  import org.mule.util.FileUtils;
24  
25  import java.io.File;
26  
27  public class FileConnectorTestCase extends AbstractConnectorTestCase
28  {
29      static final long POLLING_FREQUENCY = 1234;
30      static final long POLLING_FREQUENCY_OVERRIDE = 4321;
31  
32      private File validMessage;
33  
34      // @Override
35      protected void doSetUp() throws Exception
36      {
37          super.doSetUp();
38  
39          // The working directory is deleted on tearDown
40          File tempDir = FileUtils.newFile(muleContext.getConfiguration().getWorkingDirectory(), "tmp");
41          if (!tempDir.exists())
42          {
43              tempDir.mkdirs();
44          }
45  
46          validMessage = File.createTempFile("simple", ".mule", tempDir);
47          assertNotNull(validMessage);
48          FileUtils.writeStringToFile(validMessage, "validMessage");
49      }
50  
51      // @Override
52      protected void doTearDown() throws Exception
53      {
54          // TestConnector dispatches events via the test: protocol to test://test
55          // endpoints, which seems to end up in a directory called "test" :(
56          FileUtils.deleteTree(FileUtils.newFile(getTestConnector().getProtocol()));
57          super.doTearDown();
58      }
59  
60      /*
61       * (non-Javadoc)
62       *
63       * @see org.mule.tck.providers.AbstractConnectorTestCase#createConnector()
64       */
65      public Connector createConnector() throws Exception
66      {
67          FileConnector connector = new FileConnector();
68          connector.setName("testFile");
69          connector.setOutputAppend(true);
70          return connector;
71      }
72  
73      public String getTestEndpointURI()
74      {
75          return "file://" + muleContext.getConfiguration().getWorkingDirectory();
76      }
77  
78      public Object getValidMessage() throws Exception
79      {
80          return validMessage;
81      }
82  
83      /**
84       * Test polling frequency set on a connector.
85       */
86      public void testConnectorPollingFrequency() throws Exception
87      {
88          FileConnector connector = (FileConnector) getConnector();
89          connector.setPollingFrequency(POLLING_FREQUENCY);
90  
91          InboundEndpoint endpoint = getTestInboundEndpoint("simple");
92          Service service = getTestService();
93          MessageReceiver receiver = connector.createReceiver(service, endpoint);
94          assertEquals("Connector's polling frequency must not be ignored.", POLLING_FREQUENCY,
95                  ((FileMessageReceiver) receiver).getFrequency());
96      }
97  
98      /**
99       * Test polling frequency overridden at an endpoint level.
100      */
101     public void testPollingFrequencyEndpointOverride() throws Exception
102     {
103         FileConnector connector = (FileConnector) getConnector();
104         // set some connector-level value which we are about to override
105         connector.setPollingFrequency(-1);
106 
107         InboundEndpoint endpoint = getTestInboundEndpoint("simple");
108 
109         // Endpoint wants String-typed properties
110         endpoint.getProperties().put(FileConnector.PROPERTY_POLLING_FREQUENCY, String.valueOf(POLLING_FREQUENCY_OVERRIDE));
111 
112         Service service = getTestService();
113         MessageReceiver receiver = connector.createReceiver(service, endpoint);
114         assertEquals("Polling frequency endpoint override must not be ignored.", POLLING_FREQUENCY_OVERRIDE,
115                 ((FileMessageReceiver) receiver).getFrequency());
116     }
117 
118 
119     public void testOutputAppendEndpointOverride() throws Exception
120     {
121         FileConnector connector = (FileConnector) getConnector();
122 
123         EndpointBuilder endpointBuilder = new EndpointURIEndpointBuilder(new URIBuilder("file://foo"), muleContext);
124         OutboundEndpoint endpoint = endpointBuilder.buildOutboundEndpoint();
125 
126         // Endpoint wants String-typed properties
127         endpoint.getProperties().put("outputAppend", "true");
128 
129         try
130         {
131             connector.getDispatcherFactory().create(endpoint);
132             fail("outputAppend cannot be configured on File endpoints");
133         }
134         catch (IllegalArgumentException e)
135         {
136             //expected
137         }
138     }
139 
140     public void testOnlySingleDispatcherPerEndpoint() throws InitialisationException
141     {
142         // MULE-1773 implies that we must only have one dispatcher per endpoint
143         FileConnector connector = (FileConnector) getConnector();
144 
145         assertEquals(1, connector.getMaxDispatchersActive());
146 
147         connector.setMaxDispatchersActive(2);
148 
149         // value must be unchanged
150         assertEquals(1, connector.getMaxDispatchersActive());
151     }
152 
153 }