require 'google/protobuf' require 'test/unit' class PlatformTest < Test::Unit::TestCase def test_correct_implementation_for_platform omit('OBJECT_CACHE not defined') unless defined? Google::Protobuf::Internal::OBJECT_CACHE if Google::Protobuf::Internal::SIZEOF_LONG >= Google::Protobuf::Internal::SIZEOF_VALUE and not defined? JRUBY_VERSION assert_instance_of Google::Protobuf::Internal::ObjectCache, Google::Protobuf::Internal::OBJECT_CACHE else assert_instance_of Google::Protobuf::Internal::LegacyObjectCache, Google::Protobuf::Internal::OBJECT_CACHE end end end module ObjectCacheTestModule def test_try_add_returns_existing_value cache = self.create keys = %w[k1 k2] vals = %w[v1 v2] 2.times do |i| assert_same vals[i], cache.try_add(keys[i], vals[i]) assert_same vals[i], cache.get(keys[i]) assert_same vals[i], cache.try_add(keys[i], vals[(i+1)%2]) assert_same vals[i], cache.get(keys[i]) end end def test_multithreaded_access cache = self.create keys = %w[k0 k1 k2 k3 k4 k5 k6 k7] threads = [] 100.times do |i| threads[i] = Thread.new { Thread.current["result"] = cache.try_add(keys[i % keys.size], i.to_s) } end results = {} threads.each_with_index {|t, i| t.join; results[i] = t["result"] } assert_equal 100, results.size assert_equal 8, results.values.uniq.size end end class ObjectCacheTest < Test::Unit::TestCase def create omit('OBJECT_CACHE not defined') unless defined? Google::Protobuf::Internal::OBJECT_CACHE Google::Protobuf::Internal::ObjectCache.new end include ObjectCacheTestModule end class LegacyObjectCacheTest < Test::Unit::TestCase def create omit('OBJECT_CACHE not defined') unless defined? Google::Protobuf::Internal::OBJECT_CACHE Google::Protobuf::Internal::LegacyObjectCache.new end include ObjectCacheTestModule end