Author: jawi
Date: Fri Nov 29 12:33:09 2013
New Revision: 1546552

URL: http://svn.apache.org/r1546552
Log:
Cleanups and simplified test cases.

Added:
    
ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java
   (with props)

Added: 
ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java?rev=1546552&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java
 (added)
+++ 
ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java
 Fri Nov 29 12:33:09 2013
@@ -0,0 +1,239 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ace.agent.itest;
+
+import java.util.Set;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.ace.agent.DownloadHandle;
+import org.apache.ace.agent.DownloadHandle.DownloadProgressListener;
+import org.apache.ace.agent.DownloadResult;
+import org.apache.ace.agent.FeedbackChannel;
+import org.apache.ace.agent.FeedbackHandler;
+import org.apache.ace.agent.UpdateHandler;
+import org.osgi.framework.Version;
+
+/**
+ * Tests that we can create an agent with a completely custom controller, see 
{@link CustomStandaloneController} for
+ * more information about the actual implementation.
+ * 
+ * @see CustomStandaloneController
+ */
+public class CustomStandaloneAgentControllerTest extends 
BaseAgentControllerTest {
+
+    /**
+     * The actual custom controller as {@link Runnable} task, that simply 
loops and executes its tasks until notified to
+     * stop.
+     * 
+     * @see #run()
+     */
+    class CustomStandaloneController implements Runnable {
+        /**
+         * Main loop, will sleep for a little and once every 500 ms will do 
the following:
+         * <ol>
+         * <li>Synchronize all agent feedback with the server (see {@link 
#sendFeedbackToServer()});</li>
+         * <li>Check for agent updates (see {@link 
#checkForUpdate(UpdateType)});</li>
+         * <li>Check for deployment updates (see {@link 
#checkForUpdate(UpdateType)}).</li>
+         * </ol>
+         * <p>
+         * Note that this implementation does very little error checking and 
is rather stubborn when it comes across
+         * failures: it simply keeps retrying, which, for this use case, is 
acceptable.
+         * </p>
+         * 
+         * @see #stop()
+         * @see #checkForUpdate(UpdateType)
+         * @see #sendFeedbackToServer()
+         */
+        @Override
+        public void run() {
+            System.out.println("Custom standalone controller running...");
+
+            while (!Thread.interrupted()) {
+                try {
+                    TimeUnit.MILLISECONDS.sleep(500);
+                }
+                catch (InterruptedException exception) {
+                    // We're requested to stop...
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+
+                sendFeedbackToServer();
+
+                checkForUpdate(UpdateType.AGENT);
+
+                checkForUpdate(UpdateType.DEPLOYMENT);
+            }
+
+            System.out.println("Custom standalone controller stopped...");
+        }
+
+        /**
+         * Does the actual check for either the agent or deployment updates, 
and if available:
+         * <ol>
+         * <li>asks the "user" whether it should download this update, and if 
so;</li>
+         * <li>downloads the update to a temporary location;</li>
+         * <li>if the download is complete, it asks the "user" whether it 
should proceed with installing it, and if so;</li>
+         * <li>installs the agent/deployment update.</li>
+         * </ol>
+         * <p>
+         * In case an exception occurs during this check, it is logged and the 
method returns (early). No exceptions are
+         * propagated. In production code, a little more sophisticated error 
checking should be performed.
+         * </p>
+         * 
+         * @param updateType
+         *            the type of update we're performing, cannot be 
<code>null</code>.
+         */
+        private void checkForUpdate(UpdateType updateType) {
+            try {
+                UpdateHandler updateHandler = getUpdateHandler(updateType);
+
+                Version installed = updateHandler.getInstalledVersion();
+                Version available = updateHandler.getHighestAvailableVersion();
+                if (installed != null && installed.compareTo(available) < 0) {
+                    // Update available, ask the user whether we should 
download it...
+                    if (!m_agentUser.downloadAvailableUpdate(updateType, 
getAgentId(), installed, available)) {
+                        // No, we may not download this update now...
+                        return;
+                    }
+
+                    System.out.printf("Downloading %s update (from v%s to 
v%s)...%n", updateType, installed, available);
+
+                    DownloadHandle downloadHandle = 
updateHandler.getDownloadHandle(available, false /* fixPackage */);
+
+                    Future<DownloadResult> future = downloadHandle.start(new 
DownloadProgressListener() {
+                        @Override
+                        public void progress(long bytesRead) {
+                            System.out.printf("Download progress: %d bytes 
read...%n", bytesRead);
+                        }
+                    });
+                    // Block until the download is complete...
+                    DownloadResult result = future.get();
+
+                    // Download is complete, ask the user once more if we're 
allowed to install the update...
+                    if (m_agentUser.installAvailableUpdate(updateType, 
getAgentId(), installed, available)) {
+                        System.out.printf("Installing %s update (from v%s to 
v%s)...%n", updateType, installed, available);
+
+                        // We've confirmation that we can install this 
update...
+                        updateHandler.install(result.getInputStream());
+                    }
+
+                    // Throw away downloaded packages...
+                    downloadHandle.discard();
+                }
+            }
+            catch (Exception exception) {
+                System.out.printf("%s update failed with %s.%n", updateType, 
exception.getMessage());
+                exception.printStackTrace(System.out);
+            }
+        }
+
+        /**
+         * @return the identification of the current agent, as returned by the 
agent's API.
+         */
+        private String getAgentId() {
+            return m_agentControl.getAgentId();
+        }
+
+        /**
+         * Returns the update handler for the given {@link UpdateType}.
+         * 
+         * @param updateType
+         *            the type of update we want an update handler for, cannot 
be <code>null</code>.
+         * @return an {@link UpdateHandler} instance, never <code>null</code>.
+         */
+        private UpdateHandler getUpdateHandler(UpdateType updateType) {
+            UpdateHandler updateHandler;
+            if (UpdateType.AGENT == updateType) {
+                updateHandler = m_agentControl.getAgentUpdateHandler();
+            }
+            else {
+                updateHandler = m_agentControl.getDeploymentHandler();
+            }
+            return updateHandler;
+        }
+
+        /**
+         * Synchronizes the agent's feedback with the server by retrieving all 
feedback channels and sending their
+         * feedback to the server in turn.
+         * <p>
+         * In case an exception occurs during this check, it is logged and the 
method returns (early). No exceptions are
+         * propagated. In production code, a little more sophisticated error 
checking should be performed.
+         * </p>
+         */
+        private void sendFeedbackToServer() {
+            try {
+                FeedbackHandler feedbackHandler = 
m_agentControl.getFeedbackHandler();
+                Set<String> channelNames = feedbackHandler.getChannelNames();
+                for (String channelName : channelNames) {
+                    FeedbackChannel channel = 
feedbackHandler.getChannel(channelName);
+
+                    System.out.printf("Synchronizing feedback of %s with 
server...%n", channelName);
+
+                    channel.sendFeedback();
+                }
+            }
+            catch (Exception exception) {
+                System.out.printf("Feedback synchronization failed with 
%s.%n", exception.getMessage());
+                exception.printStackTrace(System.out);
+            }
+        }
+    }
+
+    /**
+     * Tests that we can provide a custom controller implementation based on 
the following use-case:
+     * <p>
+     * The agent should check for updates, and if found, ask the user whether 
it should proceed to download this update.
+     * If confirmed, the download of the update is started, and when complete, 
the user is asked once more whether to
+     * proceed with the installation of the update.
+     * </p>
+     * 
+     * @see CustomStandaloneController
+     */
+    public void testCustomStandaloneController() throws Exception {
+        // Tests that we're able to install DPs using only the AgentControl 
interface...
+        CustomStandaloneController controller = new 
CustomStandaloneController();
+
+        Thread thread = new Thread(controller);
+        thread.start();
+
+        try {
+            waitForInstalledVersion(m_agentControl.getDeploymentHandler(), 
m_dpVersion);
+        }
+        finally {
+            thread.interrupt();
+            thread.join();
+        }
+    }
+
+    /**
+     * Creates a new {@link CustomStandaloneAgentControllerTest} instance.
+     */
+    public CustomStandaloneAgentControllerTest() {
+        super(Object.class.getName(), "2", "0.0.2");
+    }
+
+    @Override
+    protected void configureProvisionedServices() throws Exception {
+        super.configureProvisionedServices();
+
+        m_bundleContext.registerService(AgentUser.class.getName(), new 
AcknowledgingAgentUser(), null);
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to