Learn more  » Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

vistahigherlearning / logstash   deb

Repository URL to install this package:

Version: 1.4.2-1-2c0f5a1 

/ opt / logstash / spec / outputs / csv.rb

require "csv"
require "tempfile"
require "test_utils"
require "logstash/outputs/csv"

describe LogStash::Outputs::CSV do
  extend LogStash::RSpec

  describe "Write a single field to a csv file" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          add_field => ["foo","bar"]
          count => 1
        }
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => "foo"
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0]} == "bar\n"
    end
  end

  describe "write multiple fields and lines to a csv file" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          add_field => ["foo", "bar", "baz", "quux"]
          count => 2
        }
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "baz"]
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 2
      insist {lines[0]} == "bar,quux\n"
      insist {lines[1]} == "bar,quux\n"
    end
  end

  describe "missing event fields are empty in csv" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          add_field => ["foo","bar", "baz", "quux"]
          count => 1
        }
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "not_there", "baz"]
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0]} == "bar,,quux\n"
    end
  end

  describe "commas are quoted properly" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          add_field => ["foo","one,two", "baz", "quux"]
          count => 1
        }
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "baz"]
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0]} == "\"one,two\",quux\n"
    end
  end

  describe "new lines are quoted properly" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          add_field => ["foo","one\ntwo", "baz", "quux"]
          count => 1
        }
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "baz"]
        }
      }
    CONFIG

    agent do
      lines = CSV.read(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0][0]} == "one\ntwo"
    end
  end

  describe "fields that are are objects are written as JSON" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          message => '{"foo":{"one":"two"},"baz": "quux"}'
          count => 1
        }
      }
      filter {
        json { source => "message"}
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "baz"]
        }
      }
    CONFIG

    agent do
      lines = CSV.read(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0][0]} == '{"one":"two"}'
    end
  end

  describe "can address nested field using field reference syntax" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          message => '{"foo":{"one":"two"},"baz": "quux"}'
          count => 1
        }
      }
      filter {
        json { source => "message"}
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["[foo][one]", "baz"]
        }
      }
    CONFIG

    agent do
      lines = CSV.read(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0][0]} == "two"
      insist {lines[0][1]} == "quux"
    end
  end

  describe "missing nested field is blank" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          message => '{"foo":{"one":"two"},"baz": "quux"}'
          count => 1
        }
      }
      filter {
        json { source => "message"}
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["[foo][missing]", "baz"]
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0]} == ",quux\n"
    end
  end

  describe "can choose field seperator" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          message => '{"foo":"one","bar": "two"}'
          count => 1
        }
      }
      filter {
        json { source => "message"}
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "bar"]
          csv_options => {"col_sep" => "|"}
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0]} == "one|two\n"
    end
  end
  describe "can choose line seperator" do
    tmpfile = Tempfile.new('logstash-spec-output-csv')
    config <<-CONFIG
      input {
        generator {
          message => '{"foo":"one","bar": "two"}'
          count => 2
        }
      }
      filter {
        json { source => "message"}
      }
      output {
        csv {
          path => "#{tmpfile.path}"
          fields => ["foo", "bar"]
          csv_options => {"col_sep" => "|" "row_sep" => "\t"}
        }
      }
    CONFIG

    agent do
      lines = File.readlines(tmpfile.path)
      insist {lines.count} == 1
      insist {lines[0]} == "one|two\tone|two\t"
    end
  end
end