#!/usr/bin/env ruby

require "minitar"
require "minitest_helper"
require "base64"
require "zlib"

class TestIssue46 < Minitest::Test
  SUPERLONG_TGZ = Base64.decode64(<<-EOS).freeze
H4sIAK1+smYAA+3WQQ6CMBAF0K49BScAprYd3XkALoECSiQlQYzXt0IkSKLGBdXE
/zbtNF000PkQRmG0SWq7T0p7FPOIHaNUNzrTkWI5zPt1IiYtgmSm8zw4n9q0CQLR
1HX7at/lkOeVjwP5FZNcKm14tU63uyyPUP91/e3rCJ75uF/j/Gej+6yXw/fArbnM
Z2ZlDKlb/ktNrEQQ+3gA9/xP3aS0z/e5bUXh40B+/Vj+oJ63Xkzff26zoqzmzf13
/d/98437n0izQf8DAAAAAAAAAAAAAAAAAHziCqQuXDYAKAAA
  EOS

  FILETIMES = Time.utc(2004).to_i

  superlong_name = (["0123456789abcde"] * 33).join("/")

  SUPERLONG_CONTENTS = {
    superlong_name => {:size => 496, :mode => 0o644},
    "endfile" => {:size => 0, :mode => 0o644}
  }

  def test_each_works
    reader = Zlib::GzipReader.new(StringIO.new(SUPERLONG_TGZ))

    Minitar::Input.open(reader) do |stream|
      outer = 0
      stream.each.with_index do |entry, i|
        assert_kind_of Minitar::Reader::EntryStream, entry
        assert SUPERLONG_CONTENTS.key?(entry.name), "File #{entry.name} not defined"

        assert_equal SUPERLONG_CONTENTS[entry.name][:size],
          entry.size,
          "File sizes sizes do not match: #{entry.name}"

        assert_modes_equal(SUPERLONG_CONTENTS[entry.name][:mode],
          entry.mode, entry.name)
        assert_equal(FILETIMES, entry.mtime, "entry.mtime")

        outer += 1
      end

      assert_equal(2, outer)
    end
  end
end
