-- CacheTestAccessControlImpl.mesa    Last edit: KK  September 22, 1982 10:51 am

DIRECTORY

      AccessControl
         USING[ReportCacheStats],
      AccessControlCache
         USING[ClearAccessControlCache, SetAccessControlCacheInitialized,
            VerifyClient],
      AlpineEnvironment
         USING[AccessList, Principal],
      FileIO
        USING[Open],
      Inline
        USING[DIVMOD],
      IO
        USING[Close, Handle, PutRope],
      PerfStats
         USING[CreateTimer, DestroyTimer, Initialize, InitializeTimer, Print,
            Start, Stop, Timer],
      RandomCard
        USING[Init, Choose],
      Rope
        USING[Cat, ROPE],
      SafeStorage
        USING[IsCollectorActive, WaitForCollectorDone];


CacheTestAccessControlImpl: PROGRAM
  IMPORTS AC: AccessControl, ACC: AccessControlCache, AE: AlpineEnvironment,
     FileIO, Inline, IO, PerfStats, RandomCard, Rope, SafeStorage =

BEGIN


number: CARDINAL ← 0;
charList: ARRAY [0..10) OF Rope.ROPE = ["0", "1", "2", "3", "4", "5", "6", "7",
   "8", "9"];

MakeUniqueName: PROCEDURE RETURNS[name: AE.Principal] =
   BEGIN
   q, r, n: CARDINAL;
   name ← "AlpineFakeName";
   n ← number;
   number ← number + 1;
   DO
   [q, r] ← Inline.DIVMOD[n, 10];
   name ← Rope.Cat[name, charList[r]]; -- backwards, but so what.
   IF q = 0 THEN RETURN;
   n ← q;
   ENDLOOP;
   END;


nValidNames: CARDINAL = 10;
validNames: ARRAY[0..nValidNames) OF Rope.ROPE = ["Atkinson.pa", "Cattell.pa",
   "Crowther.pa", "Taylor.pa", "Lampson.pa", "Horning.pa", "Donahue.pa",
   "Morris.pa", "Sturgis.pa", "Guibas.pa"]; -- ten members in CSLOnly↑.pa and in Bldg35↑.pa.

GetValidClient: PROCEDURE RETURNS[name: AE.Principal] =
   BEGIN
   name ← validNames[RandomCard.Choose[0, nValidNames - 1]];
   END;


GetValidAccessList: PROCEDURE RETURNS[accessList: AE.AccessList] =
   BEGIN
   accessList ← NIL;
   IF RandomCard.Choose[0, 3] = 1
      THEN accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS[(IF RandomCard.Choose[0, 1] = 1 THEN "CSLOnly↑.pa" ELSE "Bldg35↑.pa"), accessList];
   accessList ← CONS[(IF RandomCard.Choose[0, 1] = 1 THEN "CSLOnly↑.pa" ELSE "Bldg35↑.pa"), accessList];
   IF RandomCard.Choose[0, 1] = 1
      THEN accessList ← CONS[MakeUniqueName[], accessList];
   END;



RunTestLaterRegServersDown: ERROR = CODE;

ResetStatsAndGetDelta: PROCEDURE =
   BEGIN
   nCacheEntries: CARDINAL;
   currentStatsRegServersDown: LONG CARDINAL;
   [nCacheEntries, currentStats[cacheHit], currentStats[grapeAuthorized],
      currentStats[grapeNotAuthorized], currentStatsRegServersDown,
      currentStats[grapeIndivNotAuthorized]] ← AC.ReportCacheStats[];
   IF currentStatsRegServersDown # 0 THEN ERROR RunTestLaterRegServersDown;
   IF nCacheEntries # nAccessCacheEntries THEN ERROR;
   FOR statsType: StatsType IN StatsType
      DO
      IF currentStats[statsType] < prevStats[statsType] THEN ERROR;
      deltaStats[statsType] ← currentStats[statsType] - prevStats[statsType];
      prevStats[statsType] ← currentStats[statsType];
      ENDLOOP;
   END;
   
   
CheckInc: PROCEDURE [expectedStats: ARRAY StatsType OF LONG CARDINAL] =
   BEGIN
   ResetStatsAndGetDelta[];
   FOR statsType: StatsType IN StatsType
      DO IF deltaStats[statsType] # expectedStats[statsType] THEN ERROR; ENDLOOP;
   END;


 
StatsType: TYPE = {cacheHit, grapeAuthorized, grapeNotAuthorized,
   grapeIndivNotAuthorized};
prevStats: ARRAY StatsType OF LONG CARDINAL ← ALL[0];
currentStats: ARRAY StatsType OF LONG CARDINAL ← ALL[0];
deltaStats: ARRAY StatsType OF LONG CARDINAL ← ALL[0];
 
Main: PROCEDURE =
   BEGIN -- set up to call from CoPilot for debugging.
   foo: CARDINAL ← 0;
   accessList: AE.AccessList ← NIL;
   timer: PerfStats.Timer;
   activeCollect: BOOLEAN;
   prevCollectIncarn, endingPrevCollectIncarn: CARDINAL;
   [] ← RandomCard.Init[];
   BEGIN
   ENABLE ANY => foo ← foo + 1; -- protect us from the tempcedarexec.
   SetUp: PROCEDURE =
      BEGIN
      ACC.ClearAccessControlCache[];
      ResetStatsAndGetDelta[];
      PerfStats.InitializeTimer[timer];
      [activeCollect, prevCollectIncarn] ← SafeStorage.IsCollectorActive[];
      IF activeCollect
         THEN [prevCollectIncarn, , , ] ← SafeStorage.WaitForCollectorDone[];
      PerfStats.Start[timer];
      END;
   FinishUp: PROCEDURE RETURNS[done: BOOLEAN] =
      BEGIN
      PerfStats.Stop[timer];
      [activeCollect, endingPrevCollectIncarn] ← SafeStorage.IsCollectorActive[];
      IF ((activeCollect) OR (endingPrevCollectIncarn # prevCollectIncarn))
         THEN RETURN[FALSE];
      PerfStats.Print[ , resultsStreamHandle, FALSE];
      RETURN[TRUE];
      END;
   PerfStats.Initialize[];
   timer ← PerfStats.CreateTimer["timer"];
   resultsStreamHandle ← FileIO.Open["CacheTestAccessControl.Results",
      append, none];
   ACC.SetAccessControlCacheInitialized[nAccessCacheEntries];
   ResetStatsAndGetDelta[];
   
   -- simple stuff.
   
   accessList ← NIL;
   accessList ← CONS["AlpineImplementors↑.pa", accessList];
   accessList ← CONS["NoSuchAlpineList↑.pa", accessList];
   accessList ← CONS["CSL↑.pa", accessList];
   accessList ← CONS["ListWhatList↑.pa", accessList];
   IF (NOT ACC.VerifyClient["Kolling.pa", accessList]) THEN ERROR;
   CheckInc[[0, 1, 0, 1]];
   IF (NOT ACC.VerifyClient["Kolling.pa", accessList]) THEN ERROR;
   CheckInc[[1, 0, 0, 0]];
   IF (NOT ACC.VerifyClient["Taft.pa", accessList]) THEN ERROR;
   CheckInc[[0, 1, 0, 1]];
   IF (NOT ACC.VerifyClient["Kolling.pa", accessList]) THEN ERROR;
   CheckInc[[1, 0, 0, 0]];
   IF (NOT ACC.VerifyClient["Taft.pa", accessList]) THEN ERROR;
   CheckInc[[1, 0, 0, 0]];
   ACC.ClearAccessControlCache[];
      
      
   -- time for 100 grape failures, one name list.
   
   resultsStreamHandle.PutRope["
100 grape failures:
"];
   DO
   SetUp[];
   THROUGH [0..100)
      DO accessList ← NIL;
      accessList ← CONS[MakeUniqueName[], accessList];
      IF ACC.VerifyClient["Kolling.pa", accessList] THEN ERROR;
      ENDLOOP;
   IF FinishUp[]
      THEN BEGIN CheckInc[[0, 0, 100, 100]]; EXIT; END;
   ENDLOOP;
   
   
   -- time for 1 grape success and 99 cache hits, one name list.
   
   DO
   resultsStreamHandle.PutRope["
1 grape success and 99 cache hits:
"];
   SetUp[];
   accessList ← NIL;
   accessList ← CONS["AlpineImplementors↑.pa", accessList];
   THROUGH [0..100)
      DO IF NOT ACC.VerifyClient["Kolling.pa", accessList] THEN ERROR;
      ENDLOOP;
   IF FinishUp[]
      THEN BEGIN CheckInc[[99, 1, 0, 0]]; EXIT; END;
   ENDLOOP;
   
      
   -- time for 100 grape failures, four name list.
   
   resultsStreamHandle.PutRope["
100 grape failures:
"];
   DO
   SetUp[];
   THROUGH [0..25)
      DO accessList ← NIL;
      accessList ← CONS[MakeUniqueName[], accessList];
      accessList ← CONS[MakeUniqueName[], accessList];
      accessList ← CONS[MakeUniqueName[], accessList];
      accessList ← CONS[MakeUniqueName[], accessList];
      IF ACC.VerifyClient["Kolling.pa", accessList] THEN ERROR;
      ENDLOOP;
   IF FinishUp[]
      THEN BEGIN CheckInc[[0, 0, 25, 100]]; EXIT; END;
   ENDLOOP;
   
   
   -- time for 100 grape failures, same four name list.
   
   resultsStreamHandle.PutRope["
100 grape failures:
"];
   DO
   SetUp[];
   accessList ← NIL;
   accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS[MakeUniqueName[], accessList];
   THROUGH [0..25)
      DO IF ACC.VerifyClient["Kolling.pa", accessList] THEN ERROR;
      ENDLOOP;
   IF FinishUp[]
      THEN BEGIN CheckInc[[0, 0, 25, 100]]; EXIT; END;
   ENDLOOP;
   
   
  -- time for 2 grape fails, 1 grape success and 24 cache hits, four name list.
   
   resultsStreamHandle.PutRope["
2 grape fails, 1 grape success and 24 cache hits:
"];
   DO
   SetUp[];
   accessList ← NIL;
   accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS["AlpineImplementors↑.pa", accessList];
   accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS[MakeUniqueName[], accessList];
   THROUGH [0..25)
      DO IF NOT ACC.VerifyClient["Kolling.pa", accessList] THEN ERROR;
      ENDLOOP;
   IF FinishUp[]
      THEN BEGIN CheckInc[[24, 1, 0, 2]]; EXIT; END;
   ENDLOOP;
   
      
 -- time for 200 grape fails.
   
   resultsStreamHandle.PutRope["
200 grape fails:
"];
   DO
   SetUp[];
   accessList ← NIL;
   accessList ← CONS[MakeUniqueName[], accessList];
   accessList ← CONS[MakeUniqueName[], accessList];
   FOR index: CARDINAL IN [0..100)
      DO IF ACC.VerifyClient[MakeUniqueName[], accessList] THEN ERROR;
      ENDLOOP;
   IF FinishUp[]
      THEN BEGIN CheckInc[[0, 0, 100, 200]]; EXIT; END;
   ENDLOOP;
   
      
 -- mixture of stuff.
   
   ACC.ClearAccessControlCache[];
   ResetStatsAndGetDelta[];
   FOR index: CARDINAL IN [0..100)
      DO
      IF RandomCard.Choose[0,1] = 0
         THEN BEGIN
              IF NOT ACC.VerifyClient[GetValidClient[], GetValidAccessList[]]
                 THEN ERROR;
              ResetStatsAndGetDelta[];
              IF (deltaStats[cacheHit] + deltaStats[grapeAuthorized]) # 1
                 THEN ERROR;
              END
         ELSE BEGIN
              accessList ← NIL;
              accessList ← CONS[MakeUniqueName[], accessList];
              accessList ← CONS[MakeUniqueName[], accessList];
              IF ACC.VerifyClient[MakeUniqueName[], accessList] THEN ERROR;
              ResetStatsAndGetDelta[];
              IF deltaStats[grapeNotAuthorized] # 1 THEN ERROR;
              END;
      ENDLOOP;
      
   
   PerfStats.DestroyTimer[timer];
   resultsStreamHandle.Close[];
   END;
   END;
   
   

   
   
-- main line code:

resultsStreamHandle: IO.Handle;
nAccessCacheEntries: LONG CARDINAL = 100;

END.

                    Edit Log

Initial: Kolling: September 17, 1982 11:47 am: test for AccessControlCache.