ace-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r1546552 - /ace/trunk/org.apache.ace.agent.controller.itest/src/org/apache/ace/agent/itest/CustomStandaloneAgentControllerTest.java
Date Fri, 29 Nov 2013 12:33:09 GMT
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



Mime
View raw message