/* * $Id$ * * Copyright (C) 2003-2015 JNode.org * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library 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. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; If not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.jnode.test.support; import javax.naming.NameAlreadyBoundException; import javax.naming.NamingException; import junit.framework.TestCase; import org.jmock.cglib.Mock; import org.jmock.cglib.MockObjectTestCase; import org.jmock.core.stub.ReturnStub; import org.jnode.bootlog.BootLogInstance; import org.jnode.driver.Bus; import org.jnode.driver.Device; import org.jnode.driver.DriverException; import org.jnode.driver.bus.ide.DefaultIDEControllerDriver; import org.jnode.driver.bus.ide.IDEBus; import org.jnode.driver.bus.ide.IDEConstants; import org.jnode.driver.bus.ide.IDEDevice; import org.jnode.driver.bus.ide.IDEDriveDescriptor; import org.jnode.driver.bus.ide.IDEDriverUtils; import org.jnode.naming.InitialNaming; import org.jnode.system.resource.ResourceManager; import org.jnode.system.resource.ResourceNotFreeException; import org.jnode.test.fs.driver.stubs.StubDeviceManager; public class MockObjectFactory { public static IDEDevice createIDEDevice(Device parentDev, TestCase testCase, final boolean supp48bitsAddr, final long deviceSize) throws IllegalArgumentException, DriverException, ResourceNotFreeException { if ((deviceSize % IDEConstants.SECTOR_SIZE) != 0) { throw new IllegalArgumentException("deviceSize(" + deviceSize + ") must be a multiple of SECTOR_SIZE(" + IDEConstants.SECTOR_SIZE + ")"); } boolean master = true; boolean primary = true; IDEBus ideBus; try { ideBus = IDEDriverUtils.getIDEDeviceFactory().createIDEBus(parentDev, primary); } catch (NamingException ex) { throw new DriverException(ex); } // must have length 256 (see IDEDriveDescriptor) int[] data = new int[256]; Boolean atapi = Boolean.valueOf(true); final MockObjectTestCase mockTestCase = (MockObjectTestCase) testCase; MockInitializer initializer = new MockInitializer() { public void init(Mock mockDesc) { BootLogInstance.get().debug("devSize=" + deviceSize); Boolean bSupp48bitsAddr = Boolean.valueOf(supp48bitsAddr); mockDesc.expects(mockTestCase.atLeastOnce()). method("supports48bitAddressing"). withNoArguments().will(new ReturnStub(bSupp48bitsAddr)); long nbSectors = deviceSize / IDEConstants.SECTOR_SIZE; Long lNbSectors = new Long(nbSectors); String methodName = supp48bitsAddr ? "getSectorsIn48bitAddressing" : "getSectorsIn28bitAddressing"; mockDesc.expects(mockTestCase.atLeastOnce()). method(methodName). withNoArguments().will(new ReturnStub(lNbSectors)); } }; Class<?>[] clsArgs = {int[].class, boolean.class}; Object[] args = {data, atapi}; IDEDriveDescriptor desc = (IDEDriveDescriptor) MockUtils.createMockObject(IDEDriveDescriptor.class, initializer, clsArgs, args); DefaultIDEControllerDriver ctrlDriver = new DefaultIDEControllerDriver(); IDEDevice device = new IDEDevice(ideBus, primary, master, "hdTest", desc, ctrlDriver); return device; } public static void createResourceManager(TestCase testCase) throws NameAlreadyBoundException, NamingException { final MockObjectTestCase mockTestCase = (MockObjectTestCase) testCase; MockInitializer initializer = new MockInitializer() { public void init(Mock mockResMgr) { mockResMgr.expects(mockTestCase.atLeastOnce()).method("claimIOResource").withAnyArguments(); mockResMgr.expects(mockTestCase.atLeastOnce()).method("claimIRQ").withAnyArguments(); } }; ResourceManager resMgr = MockUtils.createMockObject(ResourceManager.class, initializer); InitialNaming.bind(ResourceManager.NAME, resMgr); } public static Device createParentDevice() { Class<?>[] clsArgs = new Class[]{Bus.class, String.class}; Object[] args = new Object[]{StubDeviceManager.INSTANCE.getSystemBus(), "MockDevice"}; return (Device) MockUtils.createMockObject(Device.class, clsArgs, args); } }