cartodb-4.42/spec/models/log_spec.rb
2024-04-06 05:25:13 +00:00

236 lines
10 KiB
Ruby

require_relative '../spec_helper'
include CartoDB
describe CartoDB::Log do
describe '#basic' do
it 'checks basic operations' do
user_id = Carto::UUIDHelper.random_uuid
type = Log::TYPE_DATA_IMPORT
text1 = 'test'
text2 = 'anothertest'
timestamp = Time.now.utc
log = Log.new({ type: type })
log.append(text1, false, timestamp)
log.append(text2, false, timestamp)
# Only stores now upon explicit change
log.store
log_id = log.id
log = Log.where(id:log_id).first
log.id.should eq log_id
log.type.should eq type
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::END_OF_LOG_MARK
end
end
describe '#circular buffer logic' do
it 'checks that buffer half works as expected' do
max_entries_per_half = 2
timestamp = Time.now.utc
text1 = "1"
text2 = "2"
text3 = "3"
text4 = "4"
text5 = "5"
text6 = "6"
Log.any_instance.stubs(:half_max_size).returns(max_entries_per_half)
log = Log.new({ type: Log::TYPE_DATA_IMPORT })
# Fixed half
log.append(text1, false, timestamp)
log.append(text2, false, timestamp)
# circular half
10.times do
log.append('to be deleted', false, timestamp)
end
log.append(text3, false, timestamp)
log.append(text4, false, timestamp)
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ]) +
Log::END_OF_LOG_MARK
log.append(text5, false, timestamp)
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text4 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text5 ]) +
Log::END_OF_LOG_MARK
log.append(text6, false, timestamp)
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text5 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text6 ]) +
Log::END_OF_LOG_MARK
end
it 'checks that loading a log with existing entries works' do
max_entries_per_half = 2
timestamp = Time.now.utc
text1 = "aaa"
text2 = "bbb"
text3 = "3.4"
text4 = "5 6 7 8"
text5 = "five"
text6 = "six"
Log.any_instance.stubs(:half_max_size).returns(max_entries_per_half)
log = Log.new({ type: Log::TYPE_DATA_IMPORT })
log.append(text1, false, timestamp)
log.append(text2, false, timestamp)
log.append(text3, false, timestamp)
log.append(text4, false, timestamp)
log.store
#reload
log = Log.where(id: log.id).first
# collect doesn't beautifies
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ]) +
Log::END_OF_LOG_MARK
# More tests
log = Log.new({ type: Log::TYPE_DATA_IMPORT })
log.append(text1, false, timestamp)
log.append(text2, false, timestamp)
log.append(text3, false, timestamp)
log.store
log = Log.where(id: log.id).first
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text3 ])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
Log::END_OF_LOG_MARK
# Check that new entries are added correctly
log.append(text4, false, timestamp)
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ]) +
Log::END_OF_LOG_MARK
log.append(text5, false, timestamp)
log.append(text6, false, timestamp)
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [timestamp, text1]) +
(Log::ENTRY_FORMAT % [timestamp, text2]) +
(Log::ENTRY_FORMAT % [timestamp, text5]) +
(Log::ENTRY_FORMAT % [timestamp, text6])
log.to_s.should eq (Log::ENTRY_FORMAT % [timestamp, text1]) +
(Log::ENTRY_FORMAT % [timestamp, text2]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [timestamp, text5]) +
(Log::ENTRY_FORMAT % [timestamp, text6]) +
Log::END_OF_LOG_MARK
log = Log.new({ type: Log::TYPE_DATA_IMPORT })
log.append(text1, false, timestamp)
log.store
log = Log.where(id: log.id).first
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
Log::END_OF_LOG_MARK
# This test checks that old logs with more lines than accepted get truncated correctly
log = Log.new({ type: Log::TYPE_DATA_IMPORT })
log.append(text1, false, timestamp)
log.append(text2, false, timestamp)
log.append('filll', false, timestamp)
log.append('filll more', false, timestamp)
# This goes to the circular area
log.append('filll even more', false, timestamp)
log.append(text3, false, timestamp)
log.append(text4, false, timestamp)
log.store
log = Log.where(id: log.id).first
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ]) +
Log::END_OF_LOG_MARK
#Nothing should change with this
log.send(:fix_entries_encoding)
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text2 ]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [ timestamp, text3 ]) +
(Log::ENTRY_FORMAT % [ timestamp, text4 ]) +
Log::END_OF_LOG_MARK
# Check that new entries are added correctly
log.append(text5, false, timestamp)
log.append(text6, false, timestamp)
log.send(:collect_entries).should eq (Log::ENTRY_FORMAT % [timestamp, text1]) +
(Log::ENTRY_FORMAT % [timestamp, text2]) +
(Log::ENTRY_FORMAT % [timestamp, text5]) +
(Log::ENTRY_FORMAT % [timestamp, text6])
log.to_s.should eq (Log::ENTRY_FORMAT % [ timestamp, text1 ]) +
(Log::ENTRY_FORMAT % [timestamp, text2]) +
Log::HALF_OF_LOG_MARK +
(Log::ENTRY_FORMAT % [timestamp, text5]) +
(Log::ENTRY_FORMAT % [timestamp, text6]) +
Log::END_OF_LOG_MARK
end
it 'checks zero case of a new log' do
log = Log.new({ type: Log::TYPE_DATA_IMPORT })
log.to_s.should eq Log::END_OF_LOG_MARK
log = Log.where(id: log.id).first
log.to_s.should eq Log::END_OF_LOG_MARK
# Forcing call without entries
log.send(:fix_entries_encoding)
log.to_s.should eq Log::END_OF_LOG_MARK
end
end
end