# File test/test_wpm_writer.rb, line 1192
    def test_run
      dst = build_test_page
      @number_of_threads.times{|nth|
        @driver_info[nth][:env]['REQUEST_METHOD'] = 'GET'
        @driver_info[nth][:env]['SCRIPT_NAME'] = '/test_wpm_writer.cgi'
        @driver_info[nth][:env]['PATH_INFO'] = '/MainPage'
        @driver_info[nth][:params]['action'] = 'MainPage.LinkAction.0'
        @driver_info[nth][:params]['_wpm_submit_'] = 'MainPage.Form.0'
        @driver_info[nth][:params]['MainPage.HiddenAttribute.0'] = 'hidden message'
        @driver_info[nth][:params]['MainPage.TextField.0'] = 'HALO'
        @driver_info[nth][:params]['MainPage.Password.0'] = 'open sesame'
        @driver_info[nth][:params]['MainPage.TextArea.0'] = "Hello world.\n"
        @driver_info[nth][:params]['MainPage.CheckBox.0'] = ''
        @driver_info[nth][:params]['RadioGroup'] = 'bar'
        @driver_info[nth][:params]['MainPage.Select.0'] = 'bar'
        @driver_info[nth][:params]['MainPage.SubmitButton.0'] = ''
      }

      while (Time.now < File.mtime(File.join('MainPage', 'MainPage.rb')) + 1)
        sleep(0.1)
      end
      while (Time.now < File.mtime(File.join('MainPage', 'MainPage.map')) + 1)
        sleep(0.1)
      end
      while (Time.now < File.mtime(File.join('MainPage', 'MainPage.xml')) + 1)
        sleep(0.1)
      end

      # spin lock
      ready_to_start = false
      ready_to_update = false

      th_grp = ThreadGroup.new
      @number_of_threads.times{|nth|
        th_grp.add Thread.new{
          until (ready_to_start)
            # spin lock
          end

          @driver_info[nth][:params]['nth_thread'] = nth.succ.to_s
          @ntries.times do |i|
            @driver_info[nth][:params]['nth_trial'] = i.succ.to_s
            @writer.run(@driver[nth])
            ready_to_update = true # spin lock
          end

          assert(@driver_info[nth][:env_call] > 0)
          assert(@driver_info[nth][:params_call] > 0)
          assert_equal(1 * @ntries, @driver_info[nth][:header_call]) # Rucy::Driver#header called for logging
          @ntries.times do |i|
            assert_equal('Status', @driver_info[nth][:header_name_list][i])
          end
          assert_equal(3 * @ntries, @driver_info[nth][:set_header_call])
          @ntries.times do |i|
            assert_equal([ 'Status', '200 OK' ], @driver_info[nth][:set_header_alist][i * 3 + 0])
            assert_equal([ 'Content-Type', 'text/html' ], @driver_info[nth][:set_header_alist][i * 3 + 1])
            assert_equal([ 'Content-Length', format(dst, nth.succ, i.succ).length.to_s ],
                         @driver_info[nth][:set_header_alist][i * 3 + 2])
          end
          assert(@driver_info[nth][:write_call] > 0)
          dst2 = ''
          for i in 1..@ntries
            dst2 << format(dst, nth.succ, i)
          end
          assert_equal(dst2, @driver_info[nth][:write_messg])
        }
      }

      update_thread = Thread.new{
        until (ready_to_update)
          # spin lock
        end
        File.utime(Time.now, Time.now, File.join('MainPage', 'MainPage.rb'))
        File.utime(Time.now, Time.now, File.join('MainPage', 'MainPage.map'))
        File.utime(Time.now, Time.now, File.join('MainPage', 'MainPage.xml'))
      }

      ready_to_start = true     # spin lock
      for thread in th_grp.list
        thread.join
      end
      update_thread.join
    end