From d569c417f8d53d8fd03e4d1e8a44fd0f246d82bf Mon Sep 17 00:00:00 2001
From: Anthony Martin <github@martin-studio.com>
Date: Thu, 19 Jul 2018 12:43:16 -0700
Subject: [PATCH] expanded live stream testing

---
 Rakefile | 159 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 128 insertions(+), 31 deletions(-)

diff --git a/Rakefile b/Rakefile
index 0268927..ecf3f0f 100644
--- a/Rakefile
+++ b/Rakefile
@@ -138,44 +138,141 @@ end
   
 namespace :stream do
   desc 'Test the ability to stream a block range.'
-  task :block_range do
-    block_api = Steem::BlockApi.new(url: ENV['TEST_NODE'])
+  task :block_range, [:mode, :at_block_num] do |t, args|
+    mode = (args[:mode] || 'irreversible').to_sym
+    first_block_num = args[:at_block_num].to_i if !!args[:at_block_num]
+    stream = Steem::Stream.new(url: ENV['TEST_NODE'], mode: mode)
     api = Steem::Api.new(url: ENV['TEST_NODE'])
     last_block_num = nil
-    first_block_num = nil
     last_timestamp = nil
+    range_complete = false
     
-    loop do
-      api.get_dynamic_global_properties do |properties|
-        current_block_num = properties.last_irreversible_block_num
-        # First pass replays latest a random number of blocks to test chunking.
-        first_block_num ||= current_block_num - (rand * 200).to_i
+    api.get_dynamic_global_properties do |properties|
+      current_block_num = if mode == :head
+        properties.head_block_number
+      else
+        properties.last_irreversible_block_num
+      end
+      
+      # First pass replays latest a random number of blocks to test chunking.
+      first_block_num ||= current_block_num - (rand * 200).to_i
+      
+      range = first_block_num..current_block_num
+      puts "Initial block range: #{range.size}"
+      
+      stream.blocks(at_block_num: range.first) do |block, block_num|
+        current_timestamp = Time.parse(block.timestamp + 'Z')
         
-        if current_block_num >= first_block_num
-          range = first_block_num..current_block_num
-          puts "Got block range: #{range.size}"
-          block_api.get_blocks(block_range: range) do |block, block_num|
-            current_timestamp = Time.parse(block.timestamp + 'Z')
-            
-            if !!last_timestamp && block_num != last_block_num + 1
-              puts "Bug: Last block number was #{last_block_num} then jumped to: #{block_num}"
-              exit
-            end
-            
-            if !!last_timestamp && current_timestamp < last_timestamp
-              puts "Bug: Went back in time.  Last timestamp was #{last_timestamp}, then jumped back to #{current_timestamp}"
-              exit
-            end
-            
-            puts "\t#{block_num} Timestamp: #{current_timestamp}, witness: #{block.witness}"
-            last_block_num = block_num
-            last_timestamp = current_timestamp
-          end
-          
-          first_block_num = range.max + 1
+        if !range_complete && block_num > range.last
+          puts 'Done with initial range.'
+          range_complete = true
         end
         
-        sleep 3
+        if !!last_timestamp && block_num != last_block_num + 1
+          puts "Bug: Last block number was #{last_block_num} then jumped to: #{block_num}"
+          exit
+        end
+        
+        if !!last_timestamp && current_timestamp < last_timestamp
+          puts "Bug: Went back in time.  Last timestamp was #{last_timestamp}, then jumped back to #{current_timestamp}"
+          exit
+        end
+        
+        puts "\t#{block_num} Timestamp: #{current_timestamp}, witness: #{block.witness}"
+        last_block_num = block_num
+        last_timestamp = current_timestamp
+      end
+    end
+  end
+  
+  desc 'Test the ability to stream a block range of transactions.'
+  task :trx_range, [:mode, :at_block_num] do |t, args|
+    mode = (args[:mode] || 'irreversible').to_sym
+    first_block_num = args[:at_block_num].to_i if !!args[:at_block_num]
+    stream = Steem::Stream.new(url: ENV['TEST_NODE'], mode: mode)
+    api = Steem::Api.new(url: ENV['TEST_NODE'])
+    
+    api.get_dynamic_global_properties do |properties|
+      current_block_num = if mode == :head
+        properties.head_block_number
+      else
+        properties.last_irreversible_block_num
+      end
+      
+      # First pass replays latest a random number of blocks to test chunking.
+      first_block_num ||= current_block_num - (rand * 200).to_i
+      
+      stream.transactions(at_block_num: first_block_num) do |trx, trx_id, block_num|
+        puts "#{block_num} :: #{trx_id}; ops: #{trx.operations.map(&:type).join(', ')}"
+      end
+    end
+  end
+  
+  desc 'Test the ability to stream a block range of operations.'
+  task :op_range, [:mode, :at_block_num] do |t, args|
+    mode = (args[:mode] || 'irreversible').to_sym
+    first_block_num = args[:at_block_num].to_i if !!args[:at_block_num]
+    stream = Steem::Stream.new(url: ENV['TEST_NODE'], mode: mode)
+    api = Steem::Api.new(url: ENV['TEST_NODE'])
+    
+    api.get_dynamic_global_properties do |properties|
+      current_block_num = if mode == :head
+        properties.head_block_number
+      else
+        properties.last_irreversible_block_num
+      end
+      
+      # First pass replays latest a random number of blocks to test chunking.
+      first_block_num ||= current_block_num - (rand * 200).to_i
+      
+      stream.operations(at_block_num: first_block_num) do |op, trx_id, block_num|
+        puts "#{block_num} :: #{trx_id}; op: #{op.type}"
+      end
+    end
+  end
+  
+  desc 'Test the ability to stream a block range of virtual operations.'
+  task :vop_range, [:mode, :at_block_num] do |t, args|
+    mode = (args[:mode] || 'irreversible').to_sym
+    first_block_num = args[:at_block_num].to_i if !!args[:at_block_num]
+    stream = Steem::Stream.new(url: ENV['TEST_NODE'], mode: mode)
+    api = Steem::Api.new(url: ENV['TEST_NODE'])
+    
+    api.get_dynamic_global_properties do |properties|
+      current_block_num = if mode == :head
+        properties.head_block_number
+      else
+        properties.last_irreversible_block_num
+      end
+      
+      # First pass replays latest a random number of blocks to test chunking.
+      first_block_num ||= current_block_num - (rand * 200).to_i
+      
+      stream.operations(at_block_num: first_block_num, only_virtual: true) do |op, trx_id, block_num|
+        puts "#{block_num} :: #{trx_id}; op: #{op.type}"
+      end
+    end
+  end
+  
+  desc 'Test the ability to stream a block range of all operations (including virtual).'
+  task :all_op_range, [:mode, :at_block_num] do |t, args|
+    mode = (args[:mode] || 'irreversible').to_sym
+    first_block_num = args[:at_block_num].to_i if !!args[:at_block_num]
+    stream = Steem::Stream.new(url: ENV['TEST_NODE'], mode: mode)
+    api = Steem::Api.new(url: ENV['TEST_NODE'])
+    
+    api.get_dynamic_global_properties do |properties|
+      current_block_num = if mode == :head
+        properties.head_block_number
+      else
+        properties.last_irreversible_block_num
+      end
+      
+      # First pass replays latest a random number of blocks to test chunking.
+      first_block_num ||= current_block_num - (rand * 200).to_i
+      
+      stream.operations(at_block_num: first_block_num, include_virtual: true) do |op, trx_id, block_num|
+        puts "#{block_num} :: #{trx_id}; op: #{op.type}"
       end
     end
   end
-- 
GitLab