Ruby/JRuby på Android. Del 1.5 – Cucumber (nästan) på plats

Feature: Cucumber on Android
  In order to port Cucumber to Android
  As a developing test architect
  I want to make it work
  Scenario: Port the code
       Given I have added all neccessary files
       And rewritten them in order to run on Android
       When i run cucumber
       Then the testcases should run and I will be happy

Broken Android

Aaaarrrgghhhhhh…..

Så nära men ändå så långt borta…

Vill köra Cucumber tämligen vanilj under Android och vill således inte bygga om hela skiten. Dock betar jag av problem efter problem och det är inte helt trivialt att köra JRuby med alla dess finesser på den plattformen.
Brottades länge med ett StackOverflowError men det fixade jag i …/jruby-1.6.4/lib/ruby/site_ruby/1.8/rubygems/defaults/jruby.rb genom följande ändring.

Från:

    def spec_directories_from_classpath
     require 'jruby/util' 
     stuff = JRuby::Util.classloader_resources("specifications") 
    end

Till:

    def spec_directories_from_classpath
      @@load_count||=0
      require 'jruby/util' if @@load_count==0
      @@load_count+=1
      stuff = JRuby::Util.classloader_resources("specifications")
    end

JRuby är långt ifrån buggfritt om man säger så 😉 (och hastigheten skall vi inte ens tala om…)

Nu sitter jag fast med följande fel: load error: yaml — java.lang.StackOverflowError: null från RubyKernel.java och det är nog inget jag blir klar med i natt… Något fel är trasigt och det är bara att kavla upp ärmarna och gräva vidare!

Annars har jag löst alla dependencies och kan bygga en apk som innehåller cucumber, rspec och gherkin så mina features och step_definitions läser in som de skall tillsammans med de jar-filer jag behöver!

Sen skall det vara hyffsat enkelt att köra Cucumber mot android med Ruboto, om allt funkar som jag tror det vill säga… Ruboto använder jag enbart för att bygga apk samt hjälpscripten som skapar interface och klasser, resten är native och ren Ruby/JRuby.

Ruboto har dock riktigt bra features för att snabbt implementera/wrappa ett interface:

ruboto gen interface android.location.LocationListener --name LocationListener

Eventuellt så kommer jag att börja om från grunden igen eftersom jag förlitar mig just nu på en del förbyggda jar-filer som inte jag har byggt och det kan vara där som det finns en del styggelser… Synd bara att man inte kan debugga Ruby ordentligt, bara java lagren.

MEN det ser lovande ut och snart kanske jag har mina gamla testmetodiker på plats i Android och då skall det äntligen gå att köra “riktig” BDD på Android! 🙂

Given, When, Then!

Nu måste programmerande pappor också sova så vi orkar ta hand om sjuka barn i morgon bitti…

java.lang.StackOverflowError...

Author: politisktinkorrektpappa

Share This Post On

2 Comments

  1. Bah, stacken i UI tråden är katastrofalt liten och det kommer aldrig att funka att köra i den.
    Problemet är att om jag skapar en ny tråd och maxar stack och heap så får jag påverkan i systemet och således riskerar att införa störningar… Dessutom måste man köra root shell och det kan man inte ha som krav när man skall testa så det går fetbort.

    Undrar om jag får ta och strippa Cucumber en aning så den inte laddar så mycket fluff… Gherkin inkluderar i18n och det fullständigt äter minne när den traverserar igenom all språkdata… Det kan man klara sig utan!

    Annars har jag byggt jruby-1.6.6 som komplett jarfil där jag först ändrade default.build.properties och inkluderade cucumber så nu har jag en hemgjord jarfil där jag har full koll på prylarna och som jag kan anpassa till syftet!

    Nej, jag har fått feber i kväll av mina kära barn så nu avbryter jag medans koden fortfarande kompilerar… :/

    Detta projektet var knöligare än jag först trodde – tveklöst!

    Post a Reply

Submit a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.