/** * BlueCove - Java library for Bluetooth * Copyright (C) 2008-2009 Vlad Skarzhevskyy * * 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. * * @author vlads * @version $Id$ */ package net.sf.bluecove; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.LocalDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import junit.framework.Assert; import junit.framework.TestCase; import com.intel.bluetooth.BlueCoveConfigProperties; import com.intel.bluetooth.BlueCoveImpl; import com.intel.bluetooth.EmulatorTestsHelper; /** * */ public abstract class BaseEmulatorTestCase extends TestCase { // Use this to debug tests protected boolean debug = false; protected boolean debugOnInEclipse = true; protected Thread testServerThread; protected ThreadGroup testServerThreadGroup; protected LongRunningTestMonitor monitor; /** * Default 30 seconds * * @return the length of time for test in milliseconds. */ protected int gracePeriod() { return 30 * 1000; } @Override protected void setUp() throws Exception { super.setUp(); boolean eclipse = isEclipse(); if (eclipse && debugOnInEclipse) { debug = true; } if (!eclipse && (gracePeriod() > 0)) { monitor = new LongRunningTestMonitor(gracePeriod(), this.getClass().getName() + "." + this.getName()); monitor.start(); } // Use this to debug tests if (debug) { BlueCoveImpl.setConfigProperty(BlueCoveConfigProperties.PROPERTY_DEBUG, "true"); BlueCoveImpl.setConfigProperty(BlueCoveConfigProperties.PROPERTY_DEBUG_STDOUT, "false"); } else { BlueCoveImpl.setConfigProperty(BlueCoveConfigProperties.PROPERTY_DEBUG_LOG4J, "false"); } EmulatorTestsHelper.startInProcessServer(); Runnable r = createTestServer(); if (r != null) { testServerThread = EmulatorTestsHelper.runNewEmulatorStack(r); testServerThread.setName(this.getClass().getSimpleName() + "-ServerThread"); testServerThreadGroup = testServerThread.getThreadGroup(); if (monitor != null) { monitor.setSecondaryTestThreadGroup(testServerThreadGroup); } } EmulatorTestsHelper.useThreadLocalEmulator(); } @Override protected void tearDown() throws Exception { super.tearDown(); if (testServerThreadGroup != null) { testServerThreadGroup.interrupt(); int count = testServerThreadGroup.activeCount(); Thread[] active = new Thread[count]; count = testServerThreadGroup.enumerate(active); for (int i = 0; i < count; i++) { active[i].join(5000); } } EmulatorTestsHelper.stopInProcessServer(); if (monitor != null) { monitor.finish(); monitor = null; } } /** * Override if test needs a second Thread with server * * @return */ protected Runnable createTestServer() { return null; } static public void assertEquals(String message, byte[] expected, byte[] actual) { Assert.assertNotNull(message + " value is null", actual); Assert.assertEquals(message + " length", expected.length, actual.length); for (int i = 0; i < expected.length; i++) { Assert.assertEquals(message + " byte [" + i + "]", expected[i], actual[i]); } } static public void assertEquals(String message, int length, byte[] expected, byte[] actual) { Assert.assertTrue(message + " expected.length", expected.length >= length); Assert.assertTrue(message + " actual.length", actual.length >= length); for (int i = 0; i < length; i++) { Assert.assertEquals(message + " byte [" + i + "]", expected[i], actual[i]); } } protected String selectService(String uuid) throws BluetoothStateException { return selectService(new UUID(uuid, false)); } protected String selectService(UUID uuid) throws BluetoothStateException { DiscoveryAgent discoveryAgent = LocalDevice.getLocalDevice().getDiscoveryAgent(); // Find service String serverURL = null; int retry = 0; while ((serverURL == null) && ((retry++) < 3)) { serverURL = discoveryAgent.selectService(uuid, ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); } Assert.assertNotNull("service not found", serverURL); return serverURL; } boolean isEclipse() { StackTraceElement[] ste = new Throwable().getStackTrace(); for (StackTraceElement s : ste) { if (s.getClassName().startsWith("org.eclipse.jdt")) { return true; } } return false; } }