sphero_pwn 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.travis.yml +5 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +76 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +25 -0
- data/Rakefile +39 -0
- data/VERSION +1 -0
- data/lib/sphero_pwn.rb +20 -0
- data/lib/sphero_pwn/async.rb +10 -0
- data/lib/sphero_pwn/asyncs.rb +34 -0
- data/lib/sphero_pwn/asyncs/l1_diagnostics.rb +21 -0
- data/lib/sphero_pwn/channel.rb +65 -0
- data/lib/sphero_pwn/channel_recorder.rb +60 -0
- data/lib/sphero_pwn/command.rb +54 -0
- data/lib/sphero_pwn/commands.rb +3 -0
- data/lib/sphero_pwn/commands/get_versions.rb +44 -0
- data/lib/sphero_pwn/commands/l1_diagnostics.rb +16 -0
- data/lib/sphero_pwn/commands/ping.rb +15 -0
- data/lib/sphero_pwn/replay_channel.rb +81 -0
- data/lib/sphero_pwn/response.rb +47 -0
- data/lib/sphero_pwn/session.rb +160 -0
- data/lib/sphero_pwn/test_channel.rb +18 -0
- data/test/channel_recorder_test.rb +102 -0
- data/test/command_test.rb +35 -0
- data/test/commands/get_versions_test.rb +34 -0
- data/test/commands/l1_diagnostics_test.rb +40 -0
- data/test/commands/ping_test.rb +25 -0
- data/test/data/get_version.txt +2 -0
- data/test/data/l1_diagnostics.txt +2 -0
- data/test/data/ping.txt +2 -0
- data/test/helper.rb +37 -0
- data/test/replay_channel_test.rb +147 -0
- data/test/response_test.rb +15 -0
- data/test/session_test.rb +15 -0
- data/test/sphero_pwn_test.rb +4 -0
- metadata +181 -0
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require_relative './helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe SpheroPwn::Command do
         | 
| 4 | 
            +
              it 'stringifies the ping example correctly' do
         | 
| 5 | 
            +
                ping = SpheroPwn::Command.new 0x00, 0x01, nil
         | 
| 6 | 
            +
                sequence = 0x52
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                bytes = ping.to_bytes sequence
         | 
| 9 | 
            +
                assert_equal [0xFF, 0xFF, 0x00, 0x01, 0x52, 0x01, 0xAB], bytes.unpack('C*')
         | 
| 10 | 
            +
                assert_equal Encoding::BINARY, bytes.encoding
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              it 'clears the response bit correctly' do
         | 
| 14 | 
            +
                ping = SpheroPwn::Command.new 0x00, 0x01, nil
         | 
| 15 | 
            +
                assert_equal true, ping.expects_response?
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                ping.no_response!
         | 
| 18 | 
            +
                assert_equal false, ping.expects_response?
         | 
| 19 | 
            +
                sequence = 0x52
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                bytes = ping.to_bytes sequence
         | 
| 22 | 
            +
                assert_equal [0xFF, 0xFE, 0x00, 0x01, 0x52, 0x01, 0xAB], bytes.unpack('C*')
         | 
| 23 | 
            +
                assert_equal Encoding::BINARY, bytes.encoding
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              it 'clears the timeout bit correctly' do
         | 
| 27 | 
            +
                ping = SpheroPwn::Command.new 0x00, 0x01, nil
         | 
| 28 | 
            +
                ping.no_timeout_reset!
         | 
| 29 | 
            +
                sequence = 0x52
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                bytes = ping.to_bytes sequence
         | 
| 32 | 
            +
                assert_equal [0xFF, 0xFD, 0x00, 0x01, 0x52, 0x01, 0xAB], bytes.unpack('C*')
         | 
| 33 | 
            +
                assert_equal Encoding::BINARY, bytes.encoding
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require_relative '../helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe SpheroPwn::Commands::GetVersions do
         | 
| 4 | 
            +
              it 'parses a v1 response record correctly' do
         | 
| 5 | 
            +
                response = SpheroPwn::Commands::GetVersions::Response.new 0x01, 0x00,
         | 
| 6 | 
            +
                    [0x02, 0x03, 0x01, 0xaa, 0xbb, 0x51, 0x67, 0x89]
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                assert_equal 3, response.versions[:model]
         | 
| 9 | 
            +
                assert_equal 1, response.versions[:hardware]
         | 
| 10 | 
            +
                assert_equal({ version: 0xaa, revision: 0xbb },
         | 
| 11 | 
            +
                             response.versions[:sphero_app])
         | 
| 12 | 
            +
                assert_equal({ major: 5, minor: 1}, response.versions[:bootloader])
         | 
| 13 | 
            +
                assert_equal({ major: 6, minor: 7}, response.versions[:basic])
         | 
| 14 | 
            +
                assert_equal({ major: 8, minor: 9}, response.versions[:macros])
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              describe 'when sent to the robot' do
         | 
| 18 | 
            +
                before { @session = new_test_session :get_version }
         | 
| 19 | 
            +
                after { @session.close }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                it 'receives a response with version numbers' do
         | 
| 22 | 
            +
                  @session.send_command SpheroPwn::Commands::GetVersions.new
         | 
| 23 | 
            +
                  response = @session.recv_until_response
         | 
| 24 | 
            +
                  assert_kind_of SpheroPwn::Commands::GetVersions::Response, response
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  assert_equal :ok, response.code
         | 
| 27 | 
            +
                  refute_nil response.versions[:model]
         | 
| 28 | 
            +
                  refute_nil response.versions[:hardware]
         | 
| 29 | 
            +
                  refute_nil response.versions[:bootloader]
         | 
| 30 | 
            +
                  refute_nil response.versions[:basic]
         | 
| 31 | 
            +
                  refute_nil response.versions[:macros]
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            require_relative '../helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe SpheroPwn::Commands::L1Diagnostics do
         | 
| 4 | 
            +
              it 'parses an async response correctly' do
         | 
| 5 | 
            +
                async = SpheroPwn::Asyncs.create 0x02, [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x0A]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                assert_kind_of SpheroPwn::Asyncs::L1Diagnostics, async
         | 
| 8 | 
            +
                assert_equal "Hello\n", async.text
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              describe 'when sent to the robot' do
         | 
| 12 | 
            +
                before { @session = new_test_session :l1_diagnostics }
         | 
| 13 | 
            +
                after { @session.close }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                it 'receives a response and an async result' do
         | 
| 16 | 
            +
                  @session.send_command SpheroPwn::Commands::L1Diagnostics.new
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  response = nil
         | 
| 19 | 
            +
                  async = nil
         | 
| 20 | 
            +
                  while response.nil? || async.nil?
         | 
| 21 | 
            +
                    message = @session.recv_message
         | 
| 22 | 
            +
                    if message.nil?
         | 
| 23 | 
            +
                      sleep 0.05
         | 
| 24 | 
            +
                      next
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    if message.kind_of? SpheroPwn::Response
         | 
| 28 | 
            +
                      response = message
         | 
| 29 | 
            +
                      assert_kind_of SpheroPwn::Commands::L1Diagnostics::Response, response
         | 
| 30 | 
            +
                      assert_equal :ok, response.code
         | 
| 31 | 
            +
                    else
         | 
| 32 | 
            +
                      async = message
         | 
| 33 | 
            +
                      assert_kind_of SpheroPwn::Asyncs::L1Diagnostics, async
         | 
| 34 | 
            +
                      assert_operator async.text.length, :>=, 200
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| 40 | 
            +
             | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            require_relative '../helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe SpheroPwn::Commands::Ping do
         | 
| 4 | 
            +
              it 'stringifies the ping example correctly' do
         | 
| 5 | 
            +
                ping = SpheroPwn::Commands::Ping.new
         | 
| 6 | 
            +
                sequence = 0x52
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                bytes = ping.to_bytes sequence
         | 
| 9 | 
            +
                assert_equal [0xFF, 0xFF, 0x00, 0x01, 0x52, 0x01, 0xAB], bytes.unpack('C*')
         | 
| 10 | 
            +
                assert_equal Encoding::BINARY, bytes.encoding
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              describe 'when sent to the robot' do
         | 
| 14 | 
            +
                before { @session = new_test_session :ping }
         | 
| 15 | 
            +
                after { @session.close }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                it 'receives a response' do
         | 
| 18 | 
            +
                  @session.send_command SpheroPwn::Commands::Ping.new
         | 
| 19 | 
            +
                  response = @session.recv_until_response
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  assert_kind_of SpheroPwn::Commands::Ping::Response, response
         | 
| 22 | 
            +
                  assert_equal :ok, response.code
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,2 @@ | |
| 1 | 
            +
            > FF FF 00 40 01 01 BD
         | 
| 2 | 
            +
            < FF FF 00 01 01 FD FF FE 02 05 E5 5B 53 79 73 74 65 6D 5D 0A 4D 6F 64 65 20 4E 2C 20 4C 61 73 74 20 62 6F 6F 74 20 43 4F 4C 44 0A 0A 33 38 20 72 65 63 68 72 67 2C 20 37 20 6D 69 6E 20 73 69 6E 63 65 20 6C 61 73 74 2C 20 35 3A 32 37 20 61 6C 69 76 65 0A 43 6F 6C 64 3A 33 35 2C 20 57 61 72 6D 3A 31 2C 20 57 61 6B 65 75 70 3A 30 2C 20 46 61 75 6C 74 3A 30 0A 44 69 73 74 20 72 6F 6C 6C 65 64 3A 20 31 39 38 34 20 6D 65 74 65 72 73 0A 56 62 61 74 74 20 38 2E 30 35 2C 20 73 74 61 74 65 3A 20 4F 4B 0A 53 65 6E 73 6F 72 73 48 74 68 79 3A 31 2C 20 42 54 45 72 72 6F 72 3A 31 2C 20 41 75 74 68 4F 4B 3A 31 2C 20 53 74 61 62 69 6C 69 7A 65 3A 31 2C 20 54 65 73 74 50 69 6E 3A 30 2C 20 4D 61 63 72 6F 3A 30 2C 20 6F 72 62 42 61 73 69 63 3A 4E 20 28 30 29 0A 42 6F 6F 74 6C 64 72 3D 33 2E 33 2C 20 4D 41 3D 33 2E 37 33 2C 20 42 6F 61 72 64 3D 31 2C 20 6F 72 62 42 61 73 69 63 3D 31 2E 39 0A 4D 61 63 45 78 65 63 3D 36 2C 20 43 42 3D 32 31 37 2C 20 43 68 61 73 73 69 73 20 49 44 3D 35 0A 0A 42 75 69 6C 74 3A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42 54 3A 20 30 38 4A 75 6C 32 30 31 35 20 20 0A 41 75 74 6F 52 65 63 6F 6E 20 45 6E 3D 31 20 41 75 74 6F 52 65 63 6F 6E 44 65 6C 3D 30 0A 43 6C 69 65 6E 74 54 69 6D 65 4F 75 74 3D 36 30 30 20 57 61 6B 65 55 70 53 65 63 3D 30 0A 50 65 72 6D 20 4F 70 74 69 6F 6E 20 46 6C 61 67 73 3D 30 78 30 30 30 30 30 30 31 32 2C 20 54 65 6D 70 3D 30 78 30 30 30 30 30 30 30 30 0A 0A 5B 4E 65 74 77 6F 72 6B 5D 0A 47 6F 6F 64 20 52 78 3A 31 31 38 37 31 33 2C 20 54 78 3A 39 34 38 38 0A 42 61 64 20 44 49 44 3A 31 30 2C 20 43 49 44 3A 32 34 2C 20 4C 45 4E 3A 30 2C 20 43 48 4B 3A 30 0A 4F 76 65 72 72 75 6E 73 20 52 78 3A 34 2C 20 54 78 3A 30 0A 44 65 76 20 6E 61 6D 65 3A 70 77 6E 61 6C 6C 2C 20 42 54 41 3A 36 38 38 36 65 37 30 36 31 32 33 34 0A 42 54 76 65 72 3A 42 75 69 6C 64 20 31 33 30 38 31 32 41 20 49 44 50 53 0A 0A 5B 53 65 6E 73 6F 72 73 5D 0A 46 61 69 6C 3A 20 30 20 4C 6F 63 3A 20 30 20 43 6F 64 65 3A 20 30 20 52 65 63 3A 20 30 0A 0A 5B 41 63 63 65 6C 20 78 31 30 30 30 5D 0A 6D 31 31 3D 33 2E 39 33 34 39 20 6D 31 32 3D 30 2E 30 34 37 32 20 6D 31 33 3D 2D 30 2E 30 32 33 38 0A 6D 32 31 3D 2D 30 2E 30 37 33 33 20 6D 32 32 3D 33 2E 39 34 31 30 20 6D 32 33 3D 30 2E 30 31 32 33 0A 6D 33 31 3D 2D 30 2E 30 37 31 31 20 6D 33 32 3D 30 2E 30 31 32 36 20 6D 33 33 3D 33 2E 39 34 33 36 0A 58 62 3D 30 2E 30 31 38 38 20 59 62 3D 2D 30 2E 30 30 37 30 20 5A 62 3D 2D 30 2E 30 34 34 32 0A 52 61 6E 67 65 3D 38 47 0A 0A 5B 47 79 72 6F 5D 0A 42 30 20 58 20 43 57 3A 4C 3D 2D 31 39 36 37 20 53 3D 30 2E 30 36 31 30 20 43 43 57 3A 4C 3D 31 39 36 36 20 53 3D 30 2E 30 36 31 30 0A 42 30 20 59 20 43 57 3A 4C 3D 2D 31 39 35 38 20 53 3D 30 2E 30 36 31 33 20 43 43 57 3A 4C 3D 31 39 35 38 20 53 3D 30 2E 30 36 31 33 0A 42 30 20 5A 20 43 57 3A 4C 3D 2D 31 39 35 35 20 53 3D 30 2E 30 36 31 34 20 43 43 57 3A 4C 3D 31 39 35 34 20 53 3D 30 2E 30 36 31 34 0A 42 31 20 58 20 43 57 3A 4C 3D 2D 33 32 37 36 38 20 53 3D 30 2E 30 36 31 30 20 43 43 57 3A 4C 3D 33 32 37 36 37 20 53 3D 30 2E 30 36 31 30 0A 42 31 20 59 20 43 57 3A 4C 3D 2D 33 32 37 36 38 20 53 3D 30 2E 30 36 31 30 20 43 43 57 3A 4C 3D 33 32 37 36 37 20 53 3D 30 2E 30 36 31 30 0A 42 31 20 5A 20 43 57 3A 4C 3D 2D 33 32 37 36 38 20 53 3D 30 2E 30 36 31 30 20 43 43 57 3A 4C 3D 33 32 37 36 37 20 53 3D 30 2E 30 36 31 30 0A 58 47 62 3D 2D 32 2E 37 32 34 34 20 59 47 62 3D 30 2E 32 30 36 37 20 5A 47 62 3D 30 2E 34 31 32 37 0A 47 79 72 6F 41 64 6A 43 6E 74 3D 32 31 31 32 20 41 63 74 69 76 65 3D 79 65 73 0A 4D 61 78 20 67 79 72 6F 20 58 3D 39 37 20 59 3D 32 35 34 20 5A 3D 34 37 0A 4D 69 6E 20 67 79 72 6F 20 58 3D 2D 32 32 34 20 59 3D 2D 32 34 39 20 5A 3D 2D 31 36 0A 52 65 61 6C 74 69 6D 65 20 4F 76 65 72 66 6C 6F 77 3D 33 20 4D 61 78 54 3D 30 2E 30 30 33 37 33 36 0A 0A 5B 43 6F 6E 74 72 6F 6C 5D 0A 50 69 74 63 68 20 50 3D 32 30 2E 30 30 30 20 49 3D 30 2E 32 30 30 20 44 3D 31 35 30 2E 30 30 30 0A 52 6F 6C 6C 20 50 3D 32 31 2E 30 30 30 20 49 3D 30 2E 33 30 30 20 44 3D 35 30 2E 30 30 30 0A 59 61 77 20 50 3D 39 30 2E 30 30 30 20 49 3D 30 2E 30 35 30 20 44 3D 31 32 30 30 2E 30 30 30 0A 52 6F 74 52 61 74 65 3D 32 34 30 20 46 61 73 74 52 6F 74 52 61 74 65 3D 31 30 30 30 20 64 70 73 0A 0A 5B 54 65 73 74 20 52 65 73 5D 0A 50 43 42 41 74 72 3D 30 78 37 66 66 20 53 74 6E 3D 32 0A 41 47 74 72 3D 30 78 33 20 53 74 6E 3D 31 0A 0A 5B 49 64 6C 65 20 6C 6F 6F 70 5D 0A 4D 69 6E 43 6C 6B 73 3A 33 32 39 20 4D 61 78 43 6C 6B 73 3A 36 30 33 36 39 20 4D 69 6E 46 72 65 71 3A 31 32 37 39 34 37 20 4D 61 78 46 72 65 71 3A 32 38 34 38 31 37 0A 43 50 55 20 36 35 25 20 69 64 6C 65 0A 69
         | 
    
        data/test/data/ping.txt
    ADDED
    
    
    
        data/test/helper.rb
    ADDED
    
    | @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            require 'rubygems'
         | 
| 2 | 
            +
            require 'bundler'
         | 
| 3 | 
            +
            begin
         | 
| 4 | 
            +
              Bundler.setup(:default, :development)
         | 
| 5 | 
            +
            rescue Bundler::BundlerError => e
         | 
| 6 | 
            +
              $stderr.puts e.message
         | 
| 7 | 
            +
              $stderr.puts "Run `bundle install` to install missing gems"
         | 
| 8 | 
            +
              exit e.status_code
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
            require 'minitest/autorun'
         | 
| 11 | 
            +
            require 'minitest/unit'
         | 
| 12 | 
            +
            require 'minitest/spec'
         | 
| 13 | 
            +
            require 'mocha/mini_test'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            $LOAD_PATH.unshift(File.dirname(__FILE__))
         | 
| 16 | 
            +
            $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
         | 
| 17 | 
            +
            require 'sphero_pwn'
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            class MiniTest::Test
         | 
| 20 | 
            +
              # Creates a test channel that records to a file inside the data directory.
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              # The caller is responsible for closing the channel at the end of the test.
         | 
| 23 | 
            +
              #
         | 
| 24 | 
            +
              # @param {Symbol} test_case_name used to derive the path to the recording
         | 
| 25 | 
            +
              #   file
         | 
| 26 | 
            +
              # @return {SpheroPwn::Session} a session whose backing channel records to /
         | 
| 27 | 
            +
              #   replays from the recording file for the given test case
         | 
| 28 | 
            +
              def new_test_session(test_case_name)
         | 
| 29 | 
            +
                rfconn_path = ENV['SPHERO_DEV']
         | 
| 30 | 
            +
                recording_path = File.join File.dirname(__FILE__), 'data',
         | 
| 31 | 
            +
                    "#{test_case_name}.txt"
         | 
| 32 | 
            +
                channel = SpheroPwn.new_test_channel rfconn_path, recording_path
         | 
| 33 | 
            +
                SpheroPwn::Session.new channel
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            MiniTest.autorun
         | 
| @@ -0,0 +1,147 @@ | |
| 1 | 
            +
            require_relative './helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'stringio'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe SpheroPwn::ReplayChannel do
         | 
| 6 | 
            +
              describe 'with one send operation' do
         | 
| 7 | 
            +
                let :replay do
         | 
| 8 | 
            +
                  input = StringIO.new "> 48 65 6c 6c 6f 0a\n"
         | 
| 9 | 
            +
                  File.stub :open, input do
         | 
| 10 | 
            +
                    SpheroPwn::ReplayChannel.new '/tmp/stubbed'
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                it 'returns self when data is sent correctly' do
         | 
| 15 | 
            +
                  assert_equal replay, replay.send_bytes("Hello\n")
         | 
| 16 | 
            +
                  assert_equal replay, replay.close
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                it 'compares sent data against recording' do
         | 
| 20 | 
            +
                  exception = assert_raises ArgumentError do
         | 
| 21 | 
            +
                    replay.send_bytes "Hwlo"
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  golden_error = 'Incorrect bytes sent! ' +
         | 
| 25 | 
            +
                    'Expected: [72, 101, 108, 108, 111, 10] Got: [72, 119, 108, 111]'
         | 
| 26 | 
            +
                  assert_equal golden_error, exception.message
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                it 'complains if closed early' do
         | 
| 30 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 31 | 
            +
                    replay.close
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                  assert_equal 'Closed before performing 1 operations!', exception.message
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                it 'complains if attempting to receive' do
         | 
| 37 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 38 | 
            +
                    replay.recv_bytes 1
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                  assert_equal 'Received data at an unexpected time!', exception.message
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              describe 'with one receive operation' do
         | 
| 45 | 
            +
                let :replay do
         | 
| 46 | 
            +
                  input = StringIO.new "< 48 65 6c 6c 6f 20 74 6f 6f 21 0a\n"
         | 
| 47 | 
            +
                  File.stub :open, input do
         | 
| 48 | 
            +
                    SpheroPwn::ReplayChannel.new '/tmp/stubbed'
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                it 'receives correctly in one shot' do
         | 
| 53 | 
            +
                  assert_equal "Hello too!\n", replay.recv_bytes(11)
         | 
| 54 | 
            +
                  assert_equal replay, replay.close
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                it 'receives correctly in two shots' do
         | 
| 58 | 
            +
                  assert_equal 'Hello', replay.recv_bytes(5)
         | 
| 59 | 
            +
                  assert_equal " too!\n", replay.recv_bytes(6)
         | 
| 60 | 
            +
                  assert_equal replay, replay.close
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                it 'receives correctly in three shots' do
         | 
| 64 | 
            +
                  assert_equal 'Hello', replay.recv_bytes(5)
         | 
| 65 | 
            +
                  assert_equal ' ', replay.recv_bytes(1)
         | 
| 66 | 
            +
                  assert_equal "too!\n", replay.recv_bytes(5)
         | 
| 67 | 
            +
                  assert_equal replay, replay.close
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                it 'complains if closed early' do
         | 
| 71 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 72 | 
            +
                    replay.close
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                  assert_equal 'Closed before performing 1 operations!', exception.message
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                it 'complains if attempting to send before receiving anything' do
         | 
| 78 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 79 | 
            +
                    replay.send_bytes "Hello"
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                  assert_equal 'Sent data before receiving 11 of 11 bytes!',
         | 
| 82 | 
            +
                               exception.message
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                it 'complains if attempting to send before receiving everything' do
         | 
| 86 | 
            +
                  assert_equal 'Hello', replay.recv_bytes(5)
         | 
| 87 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 88 | 
            +
                    replay.send_bytes "Hello"
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
                  assert_equal 'Sent data before receiving 6 of 11 bytes!',
         | 
| 91 | 
            +
                               exception.message
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              describe 'with no operation' do
         | 
| 96 | 
            +
                let :replay do
         | 
| 97 | 
            +
                  input = StringIO.new ''
         | 
| 98 | 
            +
                  File.stub :open, input do
         | 
| 99 | 
            +
                    SpheroPwn::ReplayChannel.new '/tmp/stubbed'
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                it 'closes correctly' do
         | 
| 104 | 
            +
                  assert_equal replay, replay.close
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                it 'complaints if attempting to send' do
         | 
| 108 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 109 | 
            +
                    replay.send_bytes "Hello\n"
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
                  assert_equal 'Sent data at an unexpected time!', exception.message
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                it 'complains if attempting to receive' do
         | 
| 115 | 
            +
                  exception = assert_raises RuntimeError do
         | 
| 116 | 
            +
                    replay.recv_bytes 1
         | 
| 117 | 
            +
                  end
         | 
| 118 | 
            +
                  assert_equal 'Received data at an unexpected time!', exception.message
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
              describe 'with a sequence of operations' do
         | 
| 123 | 
            +
                let :replay do
         | 
| 124 | 
            +
                  input = StringIO.new <<END_STRING
         | 
| 125 | 
            +
            > 48 65 6c 6c 6f 0a
         | 
| 126 | 
            +
            < 48 65 6c 6c 6f 20 74 6f 6f 21 0a
         | 
| 127 | 
            +
            > 4f 4b
         | 
| 128 | 
            +
            > 42 79 65 0a
         | 
| 129 | 
            +
            < 42 79 65 20 62 79 65 0a
         | 
| 130 | 
            +
            END_STRING
         | 
| 131 | 
            +
                  File.stub :open, input do
         | 
| 132 | 
            +
                    SpheroPwn::ReplayChannel.new '/tmp/stubbed'
         | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                it 'replays the operations correctly' do
         | 
| 137 | 
            +
                  assert_equal replay, replay.send_bytes("Hello\n")
         | 
| 138 | 
            +
                  assert_equal 'Hello', replay.recv_bytes(5)
         | 
| 139 | 
            +
                  assert_equal " too!\n", replay.recv_bytes(6)
         | 
| 140 | 
            +
                  assert_equal replay, replay.send_bytes('OK')
         | 
| 141 | 
            +
                  assert_equal replay, replay.send_bytes("Bye\n")
         | 
| 142 | 
            +
                  assert_equal 'Bye', replay.recv_bytes(3)
         | 
| 143 | 
            +
                  assert_equal " bye\n", replay.recv_bytes(5)
         | 
| 144 | 
            +
                  assert_equal replay, replay.close
         | 
| 145 | 
            +
                end
         | 
| 146 | 
            +
              end
         | 
| 147 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require_relative './helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe SpheroPwn::Response do
         | 
| 4 | 
            +
              it 'saves constructor args correctly' do
         | 
| 5 | 
            +
                response = SpheroPwn::Response.new 0x00, 0x52, [0xAA, 0xBB]
         | 
| 6 | 
            +
                assert_equal :ok, response.code
         | 
| 7 | 
            +
                assert_equal 0x52, response.sequence
         | 
| 8 | 
            +
                assert_equal [0xAA, 0xBB], response.data_bytes
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              it 'handles unknown response codes correctly' do
         | 
| 12 | 
            +
                response = SpheroPwn::Response.new 0xFA, 0x52, [0xAA, 0xBB]
         | 
| 13 | 
            +
                assert_equal :unknown, response.code
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require_relative './helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe SpheroPwn::Session do
         | 
| 4 | 
            +
              describe '#valid_checksum?' do
         | 
| 5 | 
            +
                it 'works on a correct example without data' do
         | 
| 6 | 
            +
                  assert_equal true, SpheroPwn::Session.valid_checksum?([0x00, 0x01, 0x01],
         | 
| 7 | 
            +
                      [], 0xfd)
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                it 'fails an incorrect example without data' do
         | 
| 11 | 
            +
                  assert_equal false, SpheroPwn::Session.valid_checksum?(
         | 
| 12 | 
            +
                      [0x00, 0x01, 0x01], [], 0xfa)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,181 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: sphero_pwn
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.0.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Victor Costan
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2015-12-12 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: rubyserial
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ">="
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: 0.2.4
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ">="
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: 0.2.4
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: bundler
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: 1.3.5
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: 1.3.5
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: jeweler
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ">="
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: 2.0.1
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ">="
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: 2.0.1
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: minitest
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ">="
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: 5.8.3
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - ">="
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: 5.8.3
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: mocha
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - ">="
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: 1.1.0
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - ">="
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: 1.1.0
         | 
| 83 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            +
              name: simplecov
         | 
| 85 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - ">="
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '0'
         | 
| 90 | 
            +
              type: :development
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - ">="
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: '0'
         | 
| 97 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            +
              name: yard
         | 
| 99 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 | 
            +
                requirements:
         | 
| 101 | 
            +
                - - ">="
         | 
| 102 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            +
                    version: 0.8.7.6
         | 
| 104 | 
            +
              type: :development
         | 
| 105 | 
            +
              prerelease: false
         | 
| 106 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 | 
            +
                requirements:
         | 
| 108 | 
            +
                - - ">="
         | 
| 109 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            +
                    version: 0.8.7.6
         | 
| 111 | 
            +
            description: |-
         | 
| 112 | 
            +
              This library is currently focused on reverse-engineering
         | 
| 113 | 
            +
                    the undocumented parts of Sphero
         | 
| 114 | 
            +
            email: victor@costan.us
         | 
| 115 | 
            +
            executables: []
         | 
| 116 | 
            +
            extensions: []
         | 
| 117 | 
            +
            extra_rdoc_files:
         | 
| 118 | 
            +
            - LICENSE.txt
         | 
| 119 | 
            +
            - README.markdown
         | 
| 120 | 
            +
            files:
         | 
| 121 | 
            +
            - ".document"
         | 
| 122 | 
            +
            - ".travis.yml"
         | 
| 123 | 
            +
            - Gemfile
         | 
| 124 | 
            +
            - Gemfile.lock
         | 
| 125 | 
            +
            - LICENSE.txt
         | 
| 126 | 
            +
            - README.markdown
         | 
| 127 | 
            +
            - Rakefile
         | 
| 128 | 
            +
            - VERSION
         | 
| 129 | 
            +
            - lib/sphero_pwn.rb
         | 
| 130 | 
            +
            - lib/sphero_pwn/async.rb
         | 
| 131 | 
            +
            - lib/sphero_pwn/asyncs.rb
         | 
| 132 | 
            +
            - lib/sphero_pwn/asyncs/l1_diagnostics.rb
         | 
| 133 | 
            +
            - lib/sphero_pwn/channel.rb
         | 
| 134 | 
            +
            - lib/sphero_pwn/channel_recorder.rb
         | 
| 135 | 
            +
            - lib/sphero_pwn/command.rb
         | 
| 136 | 
            +
            - lib/sphero_pwn/commands.rb
         | 
| 137 | 
            +
            - lib/sphero_pwn/commands/get_versions.rb
         | 
| 138 | 
            +
            - lib/sphero_pwn/commands/l1_diagnostics.rb
         | 
| 139 | 
            +
            - lib/sphero_pwn/commands/ping.rb
         | 
| 140 | 
            +
            - lib/sphero_pwn/replay_channel.rb
         | 
| 141 | 
            +
            - lib/sphero_pwn/response.rb
         | 
| 142 | 
            +
            - lib/sphero_pwn/session.rb
         | 
| 143 | 
            +
            - lib/sphero_pwn/test_channel.rb
         | 
| 144 | 
            +
            - test/channel_recorder_test.rb
         | 
| 145 | 
            +
            - test/command_test.rb
         | 
| 146 | 
            +
            - test/commands/get_versions_test.rb
         | 
| 147 | 
            +
            - test/commands/l1_diagnostics_test.rb
         | 
| 148 | 
            +
            - test/commands/ping_test.rb
         | 
| 149 | 
            +
            - test/data/get_version.txt
         | 
| 150 | 
            +
            - test/data/l1_diagnostics.txt
         | 
| 151 | 
            +
            - test/data/ping.txt
         | 
| 152 | 
            +
            - test/helper.rb
         | 
| 153 | 
            +
            - test/replay_channel_test.rb
         | 
| 154 | 
            +
            - test/response_test.rb
         | 
| 155 | 
            +
            - test/session_test.rb
         | 
| 156 | 
            +
            - test/sphero_pwn_test.rb
         | 
| 157 | 
            +
            homepage: http://github.com/pwnall/sphero_pwn
         | 
| 158 | 
            +
            licenses:
         | 
| 159 | 
            +
            - MIT
         | 
| 160 | 
            +
            metadata: {}
         | 
| 161 | 
            +
            post_install_message: 
         | 
| 162 | 
            +
            rdoc_options: []
         | 
| 163 | 
            +
            require_paths:
         | 
| 164 | 
            +
            - lib
         | 
| 165 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 166 | 
            +
              requirements:
         | 
| 167 | 
            +
              - - ">="
         | 
| 168 | 
            +
                - !ruby/object:Gem::Version
         | 
| 169 | 
            +
                  version: '0'
         | 
| 170 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 171 | 
            +
              requirements:
         | 
| 172 | 
            +
              - - ">="
         | 
| 173 | 
            +
                - !ruby/object:Gem::Version
         | 
| 174 | 
            +
                  version: '0'
         | 
| 175 | 
            +
            requirements: []
         | 
| 176 | 
            +
            rubyforge_project: 
         | 
| 177 | 
            +
            rubygems_version: 2.4.5.1
         | 
| 178 | 
            +
            signing_key: 
         | 
| 179 | 
            +
            specification_version: 4
         | 
| 180 | 
            +
            summary: Wrapper for Sphero's bluetooth protocol
         | 
| 181 | 
            +
            test_files: []
         |