public void TestAdvancedEarmarking() { Model model = new Model("Test model"); SelfManagingResource rsc = new SelfManagingResource(model, "Resource", Guid.NewGuid(), 2.0, 2.0, true, true, true); rsc.AccessRegulator = new SimpleAccessManager(true); object keyA = "Key A"; // Always grants to any 'A' holders. object keyA1 = "Key A1"; // Sometimes grants to 'A1' holders. object keyA2 = "Key A2"; // Sometimes grants to 'A2' holders. IAccessRegulator reg1 = new MultiKeyAccessRegulator(rsc, new ArrayList(new object[] { keyA, keyA1 })); IAccessRegulator reg2 = new MultiKeyAccessRegulator(rsc, new ArrayList(new object[] { keyA, keyA2 })); ResourceRequest rrTrack1 = new ResourceRequest(1.0); rrTrack1.Key = keyA1; ResourceRequest rrTrack2 = new ResourceRequest(1.0); rrTrack2.Key = keyA2; ResourceRequest rrKahuna = new ResourceRequest(1.0); rrKahuna.Key = keyA; ///////////////////////////////////////////////////////////////////////////// // Test A: Track 1 acquires equipment, installs key. Track 2 tries and fails. ((SimpleAccessManager)rsc.AccessRegulator).PushAccessRegulator(reg1, null); TryAcquire(rsc, rrTrack1, true); TryAcquire(rsc, rrTrack2, false); ///////////////////////////////////////////////////////////////////////////// // Test B: Push the track 2 regulator into the manager, and try to acquire from track 1 - should fail. ((SimpleAccessManager)rsc.AccessRegulator).PushAccessRegulator(reg2, null); TryAcquire(rsc, rrTrack1, false); TryAcquire(rsc, rrTrack2, true); ///////////////////////////////////////////////////////////////////////////// // Test C: Push the track 1 regulator into the manager, and try to acquire from track 1 - should succeed. ((SimpleAccessManager)rsc.AccessRegulator).PushAccessRegulator(reg1, null); TryAcquire(rsc, rrTrack2, false); TryAcquire(rsc, rrTrack1, true); ///////////////////////////////////////////////////////////////////////////// // Test D: Try to acquire from kahuna - should succeed. Then release, pop access reg, try again, should still succeed. TryAcquire(rsc, rrKahuna, true); ((SimpleAccessManager)rsc.AccessRegulator).PopAccessRegulator(null); TryAcquire(rsc, rrKahuna, true); ///////////////////////////////////////////////////////////////////////////// // Test E: Clear all access regulators, try with each key to acquire. All should succeed. ((SimpleAccessManager)rsc.AccessRegulator).PopAccessRegulator(null); ((SimpleAccessManager)rsc.AccessRegulator).PopAccessRegulator(null); TryAcquire(rsc, rrTrack1, true); TryAcquire(rsc, rrTrack2, true); TryAcquire(rsc, rrKahuna, true); }
public ResourceUser(IModel model, string name, Guid guid, SelfManagingResource smr) { InitializeIdentity(model, name, null, guid); m_irr = new SimpleResourceRequest(1.0, smr); m_model.Starting += new ModelEvent(ScheduleMyResourceAction); IMOHelper.RegisterWithModel(this); }
public PriRscReqTester(int nUsers) { m_model = new Model("Resource Testing Model..."); m_smr = new SelfManagingResource(m_model, "SMR", Guid.NewGuid(), 1.0, 1.0, true, true, true, true); m_users = new ResourceUser[nUsers]; for (int i = 0; i < nUsers; i++) { m_users[i] = new ResourceUser(m_model, "User_" + i, Guid.NewGuid(), m_smr); } m_model.Starting += new ModelEvent(AcqireResource); }
private void TryAcquire(SelfManagingResource rsc, IResourceRequest irr, bool expectSuccess) { string result = "Acqusition of " + rsc.Name + " using key " + irr.Key.ToString() + " expected to " + (expectSuccess?"succeed":"fail") + "."; if (rsc.Acquire(irr, false) == expectSuccess) { if (expectSuccess) { rsc.Release(irr); } Console.WriteLine("Sub-test passed : " + result); } else { _Debug.Assert(false, "Access Regulation", "Sub-test failed : " + result); } }
public void TestPersistentResourceBasics() { Model model = new Model("Resource Testing Model..."); SelfManagingResource steamSystem = new SelfManagingResource(model, "SteamSystem", Guid.NewGuid(), 7000.0, false, false, true); ResourceRequest[] requests = new ResourceRequest[7]; for (int i = 0; i < 7; i++) { requests[i] = new ResourceRequest(1000.0); } for (int i = 0; i < 7; i++) { if (steamSystem.Reserve(requests[i], false)) { double obtained = requests[i].QuantityObtained; double remaining = requests[i].ResourceObtained.Available; _Debug.WriteLine("Successfully reserved " + obtained + " pounds of steam - " + remaining + " remains."); } else { _Debug.WriteLine("Failed to reserve steam for request[" + i + "]"); } } _Debug.WriteLine("Unreserving steam from 2 requests"); steamSystem.Unreserve(requests[2]); double available = steamSystem.Available; _Debug.WriteLine("Successfully unreserved steam - " + available + " available."); steamSystem.Unreserve(requests[3]); available = steamSystem.Available; _Debug.WriteLine("Successfully unreserved steam - " + available + " available."); for (int i = 5; i < 7; i++) { if (steamSystem.Reserve(requests[i], false)) { double obtained = requests[i].QuantityObtained; double remaining = requests[i].ResourceObtained.Available; _Debug.WriteLine("Successfully reserved " + obtained + " pounds of steam - " + remaining + " remains."); } else { _Debug.WriteLine("Failed to acquire steam for request[" + i + "]"); } } _Debug.WriteLine("Unreserving all steam requests - "); for (int i = 0; i < 7; i++) { steamSystem.Unreserve(requests[i]); } available = steamSystem.Available; _Debug.WriteLine("Successfully unreserved steam - " + available + " available."); // AEL, bug "Reserve a resource over an existing one" submitted. // _Debug.WriteLine("Trying to acquire all steam requests - "); // for ( int i = 0; i < 7 ; i++ ) { // if ( steamSystem.Acquire(requests[i],false) ){ // double obtained = requests[i].QuantityObtained; // double remaining = requests[i].ResourceObtained.Available; // _Debug.WriteLine("Successfully acquired " + obtained + " pounds of steam - " + remaining + " remains."); // } else { // _Debug.WriteLine("Failed to acquire steam for request["+i+"]"); // } // } // // _Debug.WriteLine("Releasing 2 steam requests "); // steamSystem.Release(requests[1]); // steamSystem.Release(requests[4]); // // for ( int i = 5; i < 7 ; i++ ) { // if ( steamSystem.Acquire(requests[i],false) ){ // double obtained = requests[i].QuantityObtained; // double remaining = requests[i].ResourceObtained.Available; // _Debug.WriteLine("Successfully acquired " + obtained + " pounds of steam - " + remaining + " remains."); // } else { // _Debug.WriteLine("Failed to acquire steam for request["+i+"]"); // } // } _Debug.WriteLine("Releasing all steam requests - "); for (int i = 0; i < 7; i++) { steamSystem.Release(requests[i]); } //model.Validate(); model.Start(); }