File: gentestfiles.rb

package info (click to toggle)
ruby-zip 3.2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 11,120 kB
  • sloc: ruby: 9,958; makefile: 23
file content (161 lines) | stat: -rw-r--r-- 5,230 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# frozen_string_literal: true

$VERBOSE = true

class TestFiles
  RANDOM_ASCII_FILE1  = 'test/data/generated/randomAscii1.txt'
  RANDOM_ASCII_FILE2  = 'test/data/generated/randomAscii2.txt'
  RANDOM_ASCII_FILE3  = 'test/data/generated/randomAscii3.txt'
  RANDOM_BINARY_FILE1 = 'test/data/generated/randomBinary1.bin'
  RANDOM_BINARY_FILE2 = 'test/data/generated/randomBinary2.bin'

  NULL_FILE = 'test/data/generated/null.zip' # Zero length, so not a zip file.

  EMPTY_TEST_DIR = 'test/data/generated/emptytestdir'

  ASCII_TEST_FILES = [
    RANDOM_ASCII_FILE1, RANDOM_ASCII_FILE2, RANDOM_ASCII_FILE3
  ].freeze
  BINARY_TEST_FILES = [RANDOM_BINARY_FILE1, RANDOM_BINARY_FILE2].freeze

  class << self
    def create_test_files
      FileUtils.mkdir_p 'test/data/generated'

      ASCII_TEST_FILES.each_with_index do |filename, index|
        create_random_ascii(filename, 1E4 * (index + 1))
      end

      BINARY_TEST_FILES.each_with_index do |filename, index|
        create_random_binary(filename, 1E4 * (index + 1))
      end

      system("touch #{NULL_FILE}")

      ensure_dir(EMPTY_TEST_DIR)
    end

    private

    def create_random_ascii(filename, size)
      File.open(filename, 'wb') do |file|
        file << (0...size).map { rand(33..126).chr }.join
      end
    end

    def create_random_binary(filename, size)
      File.open(filename, 'wb') do |file|
        file << (0...size).map { rand(255) }.pack('C*')
      end
    end

    def ensure_dir(name)
      if File.exist?(name)
        return if File.stat(name).directory?

        File.delete(name)
      end
      Dir.mkdir(name)
    end
  end
end

# For representation and creation of
# test data
class TestZipFile
  attr_accessor :zip_name, :entry_names, :comment

  def initialize(zip_name, entry_names, comment = '')
    @zip_name = zip_name
    @entry_names = entry_names
    @comment = comment
  end

  def self.create_test_zips
    raise "failed to create test zip '#{TEST_ZIP1.zip_name}'" \
      unless system("zip -q #{TEST_ZIP1.zip_name} test/data/file2.txt")
    raise "failed to remove entry from '#{TEST_ZIP1.zip_name}'" \
      unless system(
        "zip -q #{TEST_ZIP1.zip_name} -d test/data/file2.txt"
      )

    File.open('test/data/generated/empty.txt', 'wb') {} # Empty file.
    File.open('test/data/generated/empty_chmod640.txt', 'wb') {} # Empty file.
    ::File.chmod(0o640, 'test/data/generated/empty_chmod640.txt')

    File.open('test/data/generated/short.txt', 'wb') { |file| file << 'ABCDEF' }
    test_text = ''
    File.open('test/data/file2.txt', 'rb') { |file| test_text = file.read }
    File.open('test/data/generated/longAscii.txt', 'wb') do |file|
      file << test_text while file.tell < 1E5
    end

    binary_pattern = ''
    File.open('test/data/generated/empty.zip', 'rb') do |file|
      binary_pattern = file.read
    end
    binary_pattern *= 4

    File.open('test/data/generated/longBinary.bin', 'wb') do |file|
      file << binary_pattern << rand << "\0" while file.tell < 6E5
    end

    raise "failed to create test zip '#{TEST_ZIP2.zip_name}'" \
      unless system(
        "zip -q #{TEST_ZIP2.zip_name} #{TEST_ZIP2.entry_names.join(' ')}"
      )

    if RUBY_PLATFORM.match?(/mswin|mingw|cygwin/)
      raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" \
        unless system(
          "cmd /c \"<NUL set /p = \"#{TEST_ZIP2.comment}\"| zip -zq #{TEST_ZIP2.zip_name}\""
        )
    else
      # without bash system interprets everything after echo as parameters to
      # echo including | zip -z ...
      raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" \
        unless system(
          "bash -c \"echo #{TEST_ZIP2.comment} | zip -zq #{TEST_ZIP2.zip_name}\""
        )
    end

    raise "failed to create test zip '#{TEST_ZIP3.zip_name}'" \
      unless system(
        "zip -q #{TEST_ZIP3.zip_name} #{TEST_ZIP3.entry_names.join(' ')}"
      )

    raise "failed to create test zip '#{TEST_ZIP4.zip_name}'" \
      unless system(
        "zip -q #{TEST_ZIP4.zip_name} #{TEST_ZIP4.entry_names.join(' ')}"
      )
  rescue StandardError
    # If there are any Windows developers wanting to use a command line zip.exe
    # to help create the following files, there's a free one available from
    # http://stahlworks.com/dev/index.php?tool=zipunzip
    # that works with the above code
    raise $ERROR_INFO.to_s +
          "\n\nziptest.rb requires the Info-ZIP program 'zip' in the path\n" \
          "to create test data. If you don't have it you can download\n" \
          'the necessary test files at http://sf.net/projects/rubyzip.'
  end

  TEST_ZIP1 = TestZipFile.new('test/data/generated/empty.zip', [])
  TEST_ZIP2 = TestZipFile.new(
    'test/data/generated/5entry.zip',
    %w[
      test/data/generated/longAscii.txt
      test/data/generated/empty.txt
      test/data/generated/empty_chmod640.txt
      test/data/generated/short.txt
      test/data/generated/longBinary.bin
    ],
    'my zip comment'
  )
  TEST_ZIP3 = TestZipFile.new(
    'test/data/generated/test1.zip', %w[test/data/file1.txt]
  )
  TEST_ZIP4 = TestZipFile.new(
    'test/data/generated/zipWithDir.zip',
    ['test/data/file1.txt', TestFiles::EMPTY_TEST_DIR]
  )
end