xref: /netbsd-src/common/dist/zlib/contrib/ada/mtest.adb (revision dbdd0313bb5e3ec7fe72f23e7f64e5236dce3bad)
1aaf4ece6Schristos----------------------------------------------------------------
2aaf4ece6Schristos--  ZLib for Ada thick binding.                               --
3aaf4ece6Schristos--                                                            --
4aaf4ece6Schristos--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
5aaf4ece6Schristos--                                                            --
6aaf4ece6Schristos--  Open source license information is in the zlib.ads file.  --
7aaf4ece6Schristos----------------------------------------------------------------
8aaf4ece6Schristos--  Continuous test for ZLib multithreading. If the test would fail
9aaf4ece6Schristos--  we should provide thread safe allocation routines for the Z_Stream.
10aaf4ece6Schristos--
11*dbdd0313Schristos--  Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp
12aaf4ece6Schristos
13aaf4ece6Schristoswith ZLib;
14aaf4ece6Schristoswith Ada.Streams;
15aaf4ece6Schristoswith Ada.Numerics.Discrete_Random;
16aaf4ece6Schristoswith Ada.Text_IO;
17aaf4ece6Schristoswith Ada.Exceptions;
18aaf4ece6Schristoswith Ada.Task_Identification;
19aaf4ece6Schristos
20aaf4ece6Schristosprocedure MTest is
21aaf4ece6Schristos   use Ada.Streams;
22aaf4ece6Schristos   use ZLib;
23aaf4ece6Schristos
24aaf4ece6Schristos   Stop : Boolean := False;
25aaf4ece6Schristos
26aaf4ece6Schristos   pragma Atomic (Stop);
27aaf4ece6Schristos
28aaf4ece6Schristos   subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
29aaf4ece6Schristos
30aaf4ece6Schristos   package Random_Elements is
31aaf4ece6Schristos      new Ada.Numerics.Discrete_Random (Visible_Symbols);
32aaf4ece6Schristos
33aaf4ece6Schristos   task type Test_Task;
34aaf4ece6Schristos
35aaf4ece6Schristos   task body Test_Task is
36aaf4ece6Schristos      Buffer : Stream_Element_Array (1 .. 100_000);
37aaf4ece6Schristos      Gen : Random_Elements.Generator;
38aaf4ece6Schristos
39aaf4ece6Schristos      Buffer_First  : Stream_Element_Offset;
40aaf4ece6Schristos      Compare_First : Stream_Element_Offset;
41aaf4ece6Schristos
42aaf4ece6Schristos      Deflate : Filter_Type;
43aaf4ece6Schristos      Inflate : Filter_Type;
44aaf4ece6Schristos
45aaf4ece6Schristos      procedure Further (Item : in Stream_Element_Array);
46aaf4ece6Schristos
47aaf4ece6Schristos      procedure Read_Buffer
48aaf4ece6Schristos        (Item : out Ada.Streams.Stream_Element_Array;
49aaf4ece6Schristos         Last : out Ada.Streams.Stream_Element_Offset);
50aaf4ece6Schristos
51aaf4ece6Schristos      -------------
52aaf4ece6Schristos      -- Further --
53aaf4ece6Schristos      -------------
54aaf4ece6Schristos
55aaf4ece6Schristos      procedure Further (Item : in Stream_Element_Array) is
56aaf4ece6Schristos
57aaf4ece6Schristos         procedure Compare (Item : in Stream_Element_Array);
58aaf4ece6Schristos
59aaf4ece6Schristos         -------------
60aaf4ece6Schristos         -- Compare --
61aaf4ece6Schristos         -------------
62aaf4ece6Schristos
63aaf4ece6Schristos         procedure Compare (Item : in Stream_Element_Array) is
64aaf4ece6Schristos            Next_First : Stream_Element_Offset := Compare_First + Item'Length;
65aaf4ece6Schristos         begin
66aaf4ece6Schristos            if Buffer (Compare_First .. Next_First - 1) /= Item then
67aaf4ece6Schristos               raise Program_Error;
68aaf4ece6Schristos            end if;
69aaf4ece6Schristos
70aaf4ece6Schristos            Compare_First := Next_First;
71aaf4ece6Schristos         end Compare;
72aaf4ece6Schristos
73aaf4ece6Schristos         procedure Compare_Write is new ZLib.Write (Write => Compare);
74aaf4ece6Schristos      begin
75aaf4ece6Schristos         Compare_Write (Inflate, Item, No_Flush);
76aaf4ece6Schristos      end Further;
77aaf4ece6Schristos
78aaf4ece6Schristos      -----------------
79aaf4ece6Schristos      -- Read_Buffer --
80aaf4ece6Schristos      -----------------
81aaf4ece6Schristos
82aaf4ece6Schristos      procedure Read_Buffer
83aaf4ece6Schristos        (Item : out Ada.Streams.Stream_Element_Array;
84aaf4ece6Schristos         Last : out Ada.Streams.Stream_Element_Offset)
85aaf4ece6Schristos      is
86aaf4ece6Schristos         Buff_Diff   : Stream_Element_Offset := Buffer'Last - Buffer_First;
87aaf4ece6Schristos         Next_First : Stream_Element_Offset;
88aaf4ece6Schristos      begin
89aaf4ece6Schristos         if Item'Length <= Buff_Diff then
90aaf4ece6Schristos            Last := Item'Last;
91aaf4ece6Schristos
92aaf4ece6Schristos            Next_First := Buffer_First + Item'Length;
93aaf4ece6Schristos
94aaf4ece6Schristos            Item := Buffer (Buffer_First .. Next_First - 1);
95aaf4ece6Schristos
96aaf4ece6Schristos            Buffer_First := Next_First;
97aaf4ece6Schristos         else
98aaf4ece6Schristos            Last := Item'First + Buff_Diff;
99aaf4ece6Schristos            Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
100aaf4ece6Schristos            Buffer_First := Buffer'Last + 1;
101aaf4ece6Schristos         end if;
102aaf4ece6Schristos      end Read_Buffer;
103aaf4ece6Schristos
104aaf4ece6Schristos      procedure Translate is new Generic_Translate
105aaf4ece6Schristos                                   (Data_In  => Read_Buffer,
106aaf4ece6Schristos                                    Data_Out => Further);
107aaf4ece6Schristos
108aaf4ece6Schristos   begin
109aaf4ece6Schristos      Random_Elements.Reset (Gen);
110aaf4ece6Schristos
111aaf4ece6Schristos      Buffer := (others => 20);
112aaf4ece6Schristos
113aaf4ece6Schristos      Main : loop
114aaf4ece6Schristos         for J in Buffer'Range loop
115aaf4ece6Schristos            Buffer (J) := Random_Elements.Random (Gen);
116aaf4ece6Schristos
117aaf4ece6Schristos            Deflate_Init (Deflate);
118aaf4ece6Schristos            Inflate_Init (Inflate);
119aaf4ece6Schristos
120aaf4ece6Schristos            Buffer_First  := Buffer'First;
121aaf4ece6Schristos            Compare_First := Buffer'First;
122aaf4ece6Schristos
123aaf4ece6Schristos            Translate (Deflate);
124aaf4ece6Schristos
125aaf4ece6Schristos            if Compare_First /= Buffer'Last + 1 then
126aaf4ece6Schristos               raise Program_Error;
127aaf4ece6Schristos            end if;
128aaf4ece6Schristos
129aaf4ece6Schristos            Ada.Text_IO.Put_Line
130aaf4ece6Schristos              (Ada.Task_Identification.Image
131aaf4ece6Schristos                 (Ada.Task_Identification.Current_Task)
132aaf4ece6Schristos               & Stream_Element_Offset'Image (J)
133aaf4ece6Schristos               & ZLib.Count'Image (Total_Out (Deflate)));
134aaf4ece6Schristos
135aaf4ece6Schristos            Close (Deflate);
136aaf4ece6Schristos            Close (Inflate);
137aaf4ece6Schristos
138aaf4ece6Schristos            exit Main when Stop;
139aaf4ece6Schristos         end loop;
140aaf4ece6Schristos      end loop Main;
141aaf4ece6Schristos   exception
142aaf4ece6Schristos      when E : others =>
143aaf4ece6Schristos         Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
144aaf4ece6Schristos         Stop := True;
145aaf4ece6Schristos   end Test_Task;
146aaf4ece6Schristos
147aaf4ece6Schristos   Test : array (1 .. 4) of Test_Task;
148aaf4ece6Schristos
149aaf4ece6Schristos   pragma Unreferenced (Test);
150aaf4ece6Schristos
151aaf4ece6Schristos   Dummy : Character;
152aaf4ece6Schristos
153aaf4ece6Schristosbegin
154aaf4ece6Schristos   Ada.Text_IO.Get_Immediate (Dummy);
155aaf4ece6Schristos   Stop := True;
156aaf4ece6Schristosend MTest;
157