git clone works
[repobrowse.git] / test / helper.rb
blob5934d69e81f6e7166ed92a6d133d502b09ec4d47
1 # Copyright (C) 2017 all contributors <repobrowse@80x24.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3 # frozen_string_literal: true
4 $stdout.sync = $stderr.sync = Thread.abort_on_exception = true
5 $-w = true if RUBY_VERSION.to_f >= 2.0
6 require 'thread'
7 require 'fileutils'
8 require 'tempfile'
9 require 'tmpdir'
10 require 'test/unit'
11 require 'webrick'
12 require 'repobrowse'
14 # fork-aware coverage data gatherer, see also test/covshow.rb
15 if ENV["COVERAGE"]
16   require "coverage"
17   COVMATCH = %r{(/lib/repobrowse\b|extras/).*rb\z}
18   COVDUMPFILE = File.expand_path("coverage.dump")
20   def __covmerge
21     res = Coverage.result
23     # do not create the file, Makefile does this before any tests run
24     File.open(COVDUMPFILE, IO::RDWR) do |covtmp|
25       covtmp.binmode
26       covtmp.sync = true
28       # we own this file (at least until somebody tries to use NFS :x)
29       covtmp.flock(File::LOCK_EX)
31       prev = covtmp.read
32       prev = prev.empty? ? {} : Marshal.load(prev)
33       res.each do |filename, counts|
34         # filter out stuff that's not in our project
35         COVMATCH =~ filename or next
37         # For compatibility with https://bugs.ruby-lang.org/issues/9508
38         # TODO: support those features if that gets merged into mainline
39         unless Array === counts
40           counts = counts[:lines]
41         end
43         merge = prev[filename] || []
44         merge = merge
45         counts.each_with_index do |count, i|
46           count or next
47           merge[i] = (merge[i] || 0) + count
48         end
49         prev[filename] = merge
50       end
51       covtmp.rewind
52       covtmp.truncate(0)
53       covtmp.write(Marshal.dump(prev))
54       covtmp.flock(File::LOCK_UN)
55     end
56   end
58   Coverage.start
59   # we need to nest at_exit to fire after minitest runs
60   at_exit { at_exit { __covmerge } }
61 end
63 def git_tmp_repo
64   Dir.mktmpdir do |tmp_dir|
65     git_dir = "#{tmp_dir}/tmp.git"
66     assert(system(*%W(git init -q --bare #{git_dir})), 'initialize git dir')
67     assert(system(*%W(git --git-dir=#{git_dir} fast-import --quiet),
68            in: "#{File.dirname(__FILE__)}/git.fast-import-data"),
69            'fast-import test repo')
70     yield tmp_dir, git_dir
71   end
72 end
74 def rack_server(app)
75   q = Queue.new
76   logq = Queue.new
77   host = '127.0.0.1'
78   config = {
79     Logger: WEBrick::Log.new(logq),
80     app: app,
81     Host: host,
82     Port: 0, # WEBrick will choose a random port
83     server: 'webrick',
84   }
85   config[:AccessLog] = [] unless test_verbose?
86   th = Thread.new do |s|
87     srv = Rack::Server.new(config)
88     srv.start { |s| q.push(s) }
89   end
90   s = q.pop
91   assert_instance_of WEBrick::HTTPServer, s
92   case l = logq.pop
93   when / port=(\d+)\n/s
94     port = $1.to_i
95     break
96   end while true
97   Thread.new do
98     while l = logq.pop
99       warn "W: #{l.inspect}"
100     end
101   end if test_verbose?
102   yield logq, host, port
103 ensure
104   s&.shutdown
105   th&.join
108 def test_verbose?
109   ENV['TEST_VERBOSE'].to_i != 0