summaryrefslogtreecommitdiff
path: root/spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb
blob: 9ffeba1b1d006109788c506c75d415f5f07280d7 (plain)
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
162
163
164
165
166
# frozen_string_literal: true

RSpec.shared_examples 'Generate Debian Distribution and component files' do
  let_it_be(:component_main) { create("debian_#{container_type}_component", distribution: distribution, name: 'main') }
  let_it_be(:component_contrib) { create("debian_#{container_type}_component", distribution: distribution, name: 'contrib') }

  let_it_be(:architecture_all) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'all') }
  let_it_be(:architecture_amd64) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'amd64') }
  let_it_be(:architecture_arm64) { create("debian_#{container_type}_architecture", distribution: distribution, name: 'arm64') }

  let_it_be(:component_file1) { create("debian_#{container_type}_component_file", component: component_contrib, architecture: architecture_all,   updated_at: '2020-01-24T08:00:00Z', file_sha256: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', file_md5: 'd41d8cd98f00b204e9800998ecf8427e', file_fixture: nil, size: 0) } # updated
  let_it_be(:component_file2) { create("debian_#{container_type}_component_file", component: component_main,    architecture: architecture_all,   updated_at: '2020-01-24T09:00:00Z', file_sha256: 'a') } # destroyed
  let_it_be(:component_file3) { create("debian_#{container_type}_component_file", component: component_main,    architecture: architecture_amd64, updated_at: '2020-01-24T10:54:59Z', file_sha256: 'b') } # destroyed, 1 second before last generation
  let_it_be(:component_file4) { create("debian_#{container_type}_component_file", component: component_contrib, architecture: architecture_all,   updated_at: '2020-01-24T10:55:00Z', file_sha256: 'c') } # kept, last generation
  let_it_be(:component_file5) { create("debian_#{container_type}_component_file", component: component_contrib, architecture: architecture_all,   updated_at: '2020-01-24T10:55:00Z', file_sha256: 'd') } # kept, last generation
  let_it_be(:component_file6) { create("debian_#{container_type}_component_file", component: component_contrib, architecture: architecture_amd64, updated_at: '2020-01-25T15:17:18Z', file_sha256: 'e') } # kept, less than 1 hour ago

  def check_component_file(release_date, component_name, component_file_type, architecture_name, expected_content)
    component_file = distribution
      .component_files
      .with_component_name(component_name)
      .with_file_type(component_file_type)
      .with_architecture_name(architecture_name)
      .order_updated_asc
      .last

    expect(component_file).not_to be_nil
    expect(component_file.updated_at).to eq(release_date)

    unless expected_content.nil?
      component_file.file.use_file do |file_path|
        expect(File.read(file_path)).to eq(expected_content)
      end
    end
  end

  it 'generates Debian distribution and component files', :aggregate_failures do
    current_time = Time.utc(2020, 01, 25, 15, 17, 18, 123456)

    travel_to(current_time) do
      expect(Gitlab::ErrorTracking).not_to receive(:log_exception)

      initial_count = 6
      destroyed_count = 2
      # updated_count = 1
      created_count = 5

      expect { subject }
        .to not_change { Packages::Package.count }
        .and not_change { Packages::PackageFile.count }
        .and change { distribution.reload.updated_at }.to(current_time.round)
        .and change { distribution.component_files.reset.count }.from(initial_count).to(initial_count - destroyed_count + created_count)
        .and change { component_file1.reload.updated_at }.to(current_time.round)

      debs = package.package_files.with_debian_file_type(:deb).preload_debian_file_metadata.to_a
      pool_prefix = "pool/unstable/#{project.id}/p/#{package.name}"
      expected_main_amd64_content = <<~EOF
      Package: libsample0
      Source: #{package.name}
      Version: #{package.version}
      Installed-Size: 7
      Maintainer: #{debs[0].debian_fields['Maintainer']}
      Architecture: amd64
      Description: Some mostly empty lib
       Used in GitLab tests.
       .
       Testing another paragraph.
      Multi-Arch: same
      Homepage: #{debs[0].debian_fields['Homepage']}
      Section: libs
      Priority: optional
      Filename: #{pool_prefix}/libsample0_1.2.3~alpha2_amd64.deb
      Size: 409600
      MD5sum: #{debs[0].file_md5}
      SHA256: #{debs[0].file_sha256}

      Package: sample-dev
      Source: #{package.name} (#{package.version})
      Version: 1.2.3~binary
      Installed-Size: 7
      Maintainer: #{debs[1].debian_fields['Maintainer']}
      Architecture: amd64
      Depends: libsample0 (= 1.2.3~binary)
      Description: Some mostly empty development files
       Used in GitLab tests.
       .
       Testing another paragraph.
      Multi-Arch: same
      Homepage: #{debs[1].debian_fields['Homepage']}
      Section: libdevel
      Priority: optional
      Filename: #{pool_prefix}/sample-dev_1.2.3~binary_amd64.deb
      Size: 409600
      MD5sum: #{debs[1].file_md5}
      SHA256: #{debs[1].file_sha256}
      EOF

      check_component_file(current_time.round, 'main', :packages, 'all', nil)
      check_component_file(current_time.round, 'main', :packages, 'amd64', expected_main_amd64_content)
      check_component_file(current_time.round, 'main', :packages, 'arm64', nil)

      check_component_file(current_time.round, 'contrib', :packages, 'all', nil)
      check_component_file(current_time.round, 'contrib', :packages, 'amd64', nil)
      check_component_file(current_time.round, 'contrib', :packages, 'arm64', nil)

      main_amd64_size = expected_main_amd64_content.length
      main_amd64_md5sum = Digest::MD5.hexdigest(expected_main_amd64_content)
      main_amd64_sha256 = Digest::SHA256.hexdigest(expected_main_amd64_content)

      contrib_all_size = component_file1.size
      contrib_all_md5sum = component_file1.file_md5
      contrib_all_sha256 = component_file1.file_sha256

      expected_release_content = <<~EOF
      Codename: unstable
      Date: Sat, 25 Jan 2020 15:17:18 +0000
      Valid-Until: Mon, 27 Jan 2020 15:17:18 +0000
      Architectures: all amd64 arm64
      Components: contrib main
      MD5Sum:
       #{contrib_all_md5sum}        #{contrib_all_size} contrib/binary-all/Packages
       d41d8cd98f00b204e9800998ecf8427e        0 contrib/binary-amd64/Packages
       d41d8cd98f00b204e9800998ecf8427e        0 contrib/binary-arm64/Packages
       d41d8cd98f00b204e9800998ecf8427e        0 main/binary-all/Packages
       #{main_amd64_md5sum}     #{main_amd64_size} main/binary-amd64/Packages
       d41d8cd98f00b204e9800998ecf8427e        0 main/binary-arm64/Packages
      SHA256:
       #{contrib_all_sha256}        #{contrib_all_size} contrib/binary-all/Packages
       e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855        0 contrib/binary-amd64/Packages
       e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855        0 contrib/binary-arm64/Packages
       e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855        0 main/binary-all/Packages
       #{main_amd64_sha256}     #{main_amd64_size} main/binary-amd64/Packages
       e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855        0 main/binary-arm64/Packages
      EOF

      distribution.file.use_file do |file_path|
        expect(File.read(file_path)).to eq(expected_release_content)
      end
    end
  end
end

RSpec.shared_examples 'Generate minimal Debian Distribution' do
  it 'generates minimal distribution', :aggregate_failures do
    travel_to(Time.utc(2020, 01, 25, 15, 17, 18, 123456)) do
      expect(Gitlab::ErrorTracking).not_to receive(:log_exception)

      expect { subject }
        .to not_change { Packages::Package.count }
        .and not_change { Packages::PackageFile.count }
        .and not_change { distribution.component_files.reset.count }

      expected_release_content = <<~EOF
      Codename: unstable
      Date: Sat, 25 Jan 2020 15:17:18 +0000
      Valid-Until: Mon, 27 Jan 2020 15:17:18 +0000
      MD5Sum:
      SHA256:
      EOF

      distribution.file.use_file do |file_path|
        expect(File.read(file_path)).to eq(expected_release_content)
      end
    end
  end
end