How CPAN Testers helped me     improve my module  It’s quite hard to write cross-platform CPANmodules, especially when you...
Who went to. . .  Barbie’s talk “Smoking   e Onion — Tales of CPAN  Testers”
Who knows about. . .  CPAN Testers
Me Léon Brocard French, live in London Like food Like the colour orange Founded Amsterdam.pm, Bath.pm, Croydon.pm Ex-leade...
Released Perl     - -   Perl .     _     - -   Perl . .     - -   Perl . .     - -   Perl . .
distributions on the CPANAcme-Buffy, Acme-Colour, App-Cache, Archive-Peek, Bisect-Perl-UsingGit,Catalyst-Plugin-CookiedSes...
Out of date  Written and released during conference:  CPAN::Mirror::Finder  CPAN::Webserver
Data structures  {       double => 4,       false   => 0,       integer => 123,       map     => {           array => [ 1,...
Data::Dumper {      double => 4,      false   => 0,      integer => 123,      map     => {          array => [ 1, 2, 3 ], ...
YAML Ain’t Markup Language  ---  double: 4  false: 0  integer: 123  map:    array:      - 1      - 2      - 3    key: valu...
Extensible Markup Language  <?xml version="1.0" encoding="UTF-8"?>  <map>  <integer>123</integer>  <double>4</double>  <nu...
JavaScript Object Notation  {      "integer":123,      "double":4,      "number":3.141,      "string":"a string",      "st...
XML <?xml version="1.0" encoding="UTF-8"?> <map> <integer>123</integer> <double>4</double> <number>3.141</number> <string>...
Simple API for XML  my $b = XML::LibXML::SAX::Builder->new();  $b->start_document;  $b->start_element( { Name => ’number’ ...
Yet Another JSON Library  “YAJL is a small event-driven (SAX-style) JSON  parser written in ANSI C, and a small validating...
YAJL example  yajl_gen g;  const unsigned char * buf;  size_t len;  g = yajl_gen_alloc(NULL);  yajl_gen_map_open(g);  yajl...
A dream my $generator = JSON::YAJL::Generator->new(); $generator->map_open(); $generator->string("number"); $generator->nu...
Wait, C?  XS – eXternal Subroutine  h xs -x  SWIG – Simpli ed Wrapper and Interface Generator  FFI – Foreign Function Inte...
Hack hack hack  Perl is written in C with macros  perlguts — Introduction to the Perl API  perlxs — XS language reference ...
CPAN Testers  CPAN Testers is an e ort to set up a Quality  Assurance (QA) team for CPAN modules.     e objective of the g...
Volunteers  Volunteers testing recent CPAN uploads  On a variety of operating systems  On a variety of platforms  On a var...
e subjectFrom: Andreas J. Konig (ANDK)Subject: FAIL JSON-YAJL-0.01 v5.8.7 GNU/LinuxDate: 2011-04-11T10:25:15ZThis distribu...
Grades  PASS    distribution built and tested correctly  FAIL    distribution failed to test correctly  UNKNOWN distributi...
Preamble  Dear Leon Brocard,  This is a computer-generated report for  JSON-YAJL-0.01 on perl 5.8.7, created by  CPAN-Repo...
Tester comments  This report is from an automated smoke  testing program and was not reviewed by  a human for accuracy.
Program output  Output from ’./Build test’:  t/pod.t ..... ok  Can’t load ’/home/sand/.cpan/build/JSON-YAJL-0.01-vYmtrJ/bl...
Also  Prerequisites (and version numbers)  Environment variables (PATH, SHELL etc.)  Perl special variables and OS-speci c...
Summary of perl con guration  Summary of my perl5 (revision 5 version 8 subversion 7) configuration:    Platform:      osn...
e errorCan’t load‘/home/sand/.cpan/build/JSON-YAJL- . -vYmtrJ-/blib/arch/auto/JSON/YAJL/Generator/Generator.so’for module ...
perlapi says  Creates a new SV and copies a string into it. If utf is  true, calls "SvUTF _on" on the new SV.  SV* newSVpv...
Devel::PPPort - Perl/Pollution/Portability  Perl’s API has changed over time, gaining new  features, new functions, increa...
Release .  Include ppport.h   .   Mon Apr       : :   CEST
Release .  Unde ned symbol "DPPP_my_newSVpvn_ ags"
Release .       ( )  ppport.h is runnable  #define NEED_newSVpvn_flags  #define NEED_sv_2pv_flags
Release .        ( )  do not include stdint.h as we do not need it   .   Tue Apr      : :   CEST
Release .  got: .                      expected: .  Stop using .   for testing oats  What Every Computer Scientist Should ...
Release .       ( )  symbol isinf: referenced symbol not found  #if defined (__SVR4) && defined (__sun)  #ifndef isinf  #i...
Release .        ( )  Error: ’const char *’ not in typemap in Generator.xs,  line  add const char * to the typemap to supp...
Release .        ( )  throw exceptions upon YAJL error states   .   Wed Apr      :   :   CEST
Release .  Half the tests failed!  error: too few arguments to function ’Perl_croak’  use aTHX_ when Perl_croak-ing to wor...
Release .        ( )  expecting: Regexp ((?-xism:Invalid number)) found:  YAJL: Keys must be strings  Only test inf and na...
Release .   x minor documentation typo  don’t test inf and nan under MSWin  add an interface to the parser  take advantage...
Release .  link to YAJL website, as pointed out by Olivier  Mengué  add homepage, repository and bugtracker  distribution ...
Release .  update to YAJL . .   .   Mon Jun     : :   BST
Release .  don’t test inf and nan under MirOS BSD  work around not nding isinf under Solaris  work around missing sprintf_...
Release .  work aroud the fact that win mingw/gcc doesn’t  have sprintf_s (for Strawberry Perl)  move dSP to top of callba...
Microso Visual C++ does not support long long:yajlyajl_parse.h(77) : error C2632: ’long’  followed by ’long’ is illegalyaj...
...
How to become a CPAN Tester  CPAN::Reporter  http://wiki.cpantesters.org/
CPAN Testers Leaderboard   st ,          ,       Chris Williams (BINGOS)   nd ,              ,   Andreas J. König (ANDK)  ...
Summary  ,     test reports      perls       platforms All helping to make CPAN modules more portable
On next at        :  Liel¯ z¯le: Perl Lists, Arrays, and Hashes vivi ed:      a a  lazy, in nite, at, slurpy, typed, bound...
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
How CPAN Testers helped me improve my module
Upcoming SlideShare
Loading in...5
×

How CPAN Testers helped me improve my module

3,346

Published on

It's quite hard to write cross-platform CPAN modules, especially when you use XS to interface with C libraries. Luckily, CPAN Testers tests your modules on many platforms for you. Come see how CPAN Testers helped me to create a fully portable module.

Presented at YAPC::Europe 2011.

Published in: Technology, Art & Photos
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,346
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

How CPAN Testers helped me improve my module

  1. 1. How CPAN Testers helped me improve my module It’s quite hard to write cross-platform CPANmodules, especially when you use XS to interfacewith C libraries. Luckily, CPAN Testers tests your modules on many platforms for you. Come see how CPAN Testers helped me to create a fully portable module. Léon Brocard YAPC::Europe
  2. 2. Who went to. . . Barbie’s talk “Smoking e Onion — Tales of CPAN Testers”
  3. 3. Who knows about. . . CPAN Testers
  4. 4. Me Léon Brocard French, live in London Like food Like the colour orange Founded Amsterdam.pm, Bath.pm, Croydon.pm Ex-leader of London.pm Started YAPC::Europe Looking for employment Perl hacker
  5. 5. Released Perl - - Perl . _ - - Perl . . - - Perl . . - - Perl . .
  6. 6. distributions on the CPANAcme-Buffy, Acme-Colour, App-Cache, Archive-Peek, Bisect-Perl-UsingGit,Catalyst-Plugin-CookiedSession, Catalyst-Plugin-SimpleAuth, Compress-LZF_PP,Compress-LZMA-External, CPAN-IndexPod, CPAN-Metadata-RDF, CPAN-Mini-Live,CPAN-Unpack, Crypt-Skip32-Base32Crockford, Crypt-Skip32-Base64URLSafe, Dackup,Data-Page, Data-UUID-Base64URLSafe, DateTime-Stringify, Devel-ebug, Devel-ebug-HTTP,Devel-Profit, Email-Send-Gandi, Email-Send-Gmail, File-Copy-Reliable, Fir,Games-GuessWord, GraphViz, Haul, HTML-Fraction, HTTP-Server-Simple-Kwiki,Image-Imlib2, Image-Imlib2-Thumbnail, Image-Imlib2-Thumbnail-S3, Image-WorldMap,Java-JVM-Classfile, JSON-XS-VersionOneAndTwo, JSON-YAJL, Kasago, Language-Functional,LWP-ConnCache-MaxKeepAliveRequests, Mac-EyeTV, MealMaster, Messaging-Courier,Module-CPANTS-Generator, Module-Packaged, MP3-ID3Lib, Net-Amazon-S3,Net-Amazon-S3-Client-GPG, Net-Amazon-SimpleQueue, Net-Cassandra, Net-DPAP-Client,Net-FleetDB, Net-FTP-Throttle, Net-LastFM, Net-MythTV, Net-MythWeb, Net-OpenDHT,Net-VNC, Number-DataRate, OpenFrame-Segment-Apache, OpenFrame-Segment-Apache2,Parse-BACKPAN-Packages, Parse-CPAN-Authors, Parse-CPAN-Ratings, Perl-Metric-Basic,PPIx-IndexOffsets, PPIx-LineToSub, Search-Mousse, String-Koremutake,Template-Plugin-Page, Template-Stash-Strict, Term-ProgressBar-Quiet, Test-Expect,Test-WWW-Mechanize-PSGI, Tie-GHash, Tree-Ternary_XS, TV-Anytime, WWW-Gazetteer,WWW-Gazetteer-FallingRain, WWW-Gazetteer-Getty, WWW-Mechanize-Timed,WWW-Search-Google
  7. 7. Out of date Written and released during conference: CPAN::Mirror::Finder CPAN::Webserver
  8. 8. Data structures { double => 4, false => 0, integer => 123, map => { array => [ 1, 2, 3 ], key => "value" }, null => undef, number => "3.141", string => "a string", string2 => "another string", true => 1 };
  9. 9. Data::Dumper { double => 4, false => 0, integer => 123, map => { array => [ 1, 2, 3 ], key => "value" }, null => undef, number => "3.141", string => "a string", string2 => "another string", true => 1 };
  10. 10. YAML Ain’t Markup Language --- double: 4 false: 0 integer: 123 map: array: - 1 - 2 - 3 key: value null: ~ number: 3.141 string: a string string2: another string true: 1
  11. 11. Extensible Markup Language <?xml version="1.0" encoding="UTF-8"?> <map> <integer>123</integer> <double>4</double> <number>3.141</number> <string>a string</string> <string>another string</string> <null/> <true/> <false/> <map> <string>value</string> <array> <number>1</number> <number>2</number> <number>3</number> </array>
  12. 12. JavaScript Object Notation { "integer":123, "double":4, "number":3.141, "string":"a string", "string2":"another string", "null":null, "true":true, "false":false, "map":{"key":"value","array":[1,2,3]} }
  13. 13. XML <?xml version="1.0" encoding="UTF-8"?> <map> <integer>123</integer> <double>4</double> <number>3.141</number> <string>a string</string> <string>another string</string> <null/> <true/> <false/> <map> <string>value</string> <array> <number>1</number> <number>2</number> <number>3</number> </array>
  14. 14. Simple API for XML my $b = XML::LibXML::SAX::Builder->new(); $b->start_document; $b->start_element( { Name => ’number’ } ); $b->characters( { Data => ’3.141’ } ); $b->end_element( { Name => ’number’ } ); $b->end_document; say $b->result->toString; # generates: <?xml version="1.0"?> <number>3.141</number>
  15. 15. Yet Another JSON Library “YAJL is a small event-driven (SAX-style) JSON parser written in ANSI C, and a small validating JSON generator” http://lloyd.github.com/yajl/
  16. 16. YAJL example yajl_gen g; const unsigned char * buf; size_t len; g = yajl_gen_alloc(NULL); yajl_gen_map_open(g); yajl_gen_string(g, "number", 6); yajl_gen_number(g, "3.141", 5); yajl_gen_map_close(g); yajl_gen_get_buf(g, &buf, &len); # {"number":3.141} fwrite(buf, 1, len, stdout); yajl_gen_clear(g); yajl_gen_free(g);
  17. 17. A dream my $generator = JSON::YAJL::Generator->new(); $generator->map_open(); $generator->string("number"); $generator->number("3.141"); $generator->map_close(); say $generator->get_buf; # {"number":3.141}
  18. 18. Wait, C? XS – eXternal Subroutine h xs -x SWIG – Simpli ed Wrapper and Interface Generator FFI – Foreign Function Interface
  19. 19. Hack hack hack Perl is written in C with macros perlguts — Introduction to the Perl API perlxs — XS language reference manual perlxstut — Tutorial for writing XSUBs perlport — Writing portable Perl Works on my machine, so ship it . Mon Apr : : CEST
  20. 20. CPAN Testers CPAN Testers is an e ort to set up a Quality Assurance (QA) team for CPAN modules. e objective of the group is to test as many of the distributions on CPAN as possible, on as many platforms as possible. e ultimate goal is to improve the portability of the distributions on CPAN, and provide good feedback to the authors.
  21. 21. Volunteers Volunteers testing recent CPAN uploads On a variety of operating systems On a variety of platforms On a variety of Perl versions
  22. 22. e subjectFrom: Andreas J. Konig (ANDK)Subject: FAIL JSON-YAJL-0.01 v5.8.7 GNU/LinuxDate: 2011-04-11T10:25:15ZThis distribution has been tested as part ofthe CPAN Testers project, supporting thePerl programming language. Seehttp://wiki.cpantesters.org/ for moreinformation or email questions tocpan-testers-discuss@perl.org
  23. 23. Grades PASS distribution built and tested correctly FAIL distribution failed to test correctly UNKNOWN distribution failed to build, had no test suite or outcome was inconclu- sive NA distribution is not applicable to this platform and/or version of Perl
  24. 24. Preamble Dear Leon Brocard, This is a computer-generated report for JSON-YAJL-0.01 on perl 5.8.7, created by CPAN-Reporter-1.1902. Thank you for uploading your work to CPAN. However, there was a problem testing your distribution. If you think this report is invalid, please consult the CPAN Testers Wiki for suggestions on how to avoid getting FAIL reports for missing library or binary dependencies, unsupported operating systems, and so on:
  25. 25. Tester comments This report is from an automated smoke testing program and was not reviewed by a human for accuracy.
  26. 26. Program output Output from ’./Build test’: t/pod.t ..... ok Can’t load ’/home/sand/.cpan/build/JSON-YAJL-0.01-vYmtrJ/blib/arch/auto/JSON/YAJL/Generator/G at /home/sand/.cpan/build/JSON-YAJL-0.01-vYmtrJ/blib/lib/JSON/YAJL.pm line 4 Compilation failed in require at /home/sand/.cpan/build/JSON-YAJL-0.01-vYmtrJ/blib/lib/JSON/Y BEGIN failed--compilation aborted at /home/sand/.cpan/build/JSON-YAJL-0.01-vYmtrJ/blib/lib/JS Compilation failed in require at t/simple.t line 5. BEGIN failed--compilation aborted at t/simple.t line 5. t/simple.t .. Dubious, test returned 9 (wstat 2304, 0x900) No subtests run Test Summary Report ------------------- t/simple.t (Wstat: 2304 Tests: 0 Failed: 0) Non-zero exit status: 9 Parse errors: No plan found in TAP output Files=2, Tests=2, 0 wallclock secs ( 0.03 usr 0.00 sys + 0.07 cusr 0.02 csys = 0.12 CPU) Result: FAIL Failed 1/2 test programs. 0/2 subtests failed.
  27. 27. Also Prerequisites (and version numbers) Environment variables (PATH, SHELL etc.) Perl special variables and OS-speci c diagnostics Perl module toolchain versions installed
  28. 28. Summary of perl con guration Summary of my perl5 (revision 5 version 8 subversion 7) configuration: Platform: osname=linux, osvers=2.6.26-1-amd64, archname=x86_64-linux-thread-multi-ld uname=’linux k81 2.6.26-1-amd64 #1 smp mon dec 15 17:25:36 utc 2008 x86_64 gnulinux ’ config_args=’-Dprefix=/usr/local/perl-5.8.7-threaded -Uversiononly -Dusedevel -Ui_db -Dus hint=recommended, useposix=true, d_sigaction=define usethreads=define use5005threads=undef useithreads=define usemultiplicity=define useperlio=define d_sfio=undef uselargefiles=define usesocks=undef use64bitint=define use64bitall=define uselongdouble=define usemymalloc=n, bincompat5005=undef Compiler: cc=’cc’, ccflags =’-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -fno-strict-aliasing -p optimize=’-O2’, cppflags=’-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -fno-strict-aliasing -pipe -I/us ccversion=’’, gccversion=’4.3.2’, gccosandvers=’’ intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 ivtype=’long’, ivsize=8, nvtype=’long double’, nvsize=16, Off_t=’off_t’, lseeksize=8 alignbytes=16, prototype=define Linker and Libraries: ld=’cc’, ldflags =’ -L/usr/local/lib’ libpth=/usr/local/lib /lib /usr/lib libs=-lnsl -ldb -ldl -lm -lcrypt -lutil -lpthread -lc perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc libc=/lib/libc-2.7.so, so=so, useshrplib=false, libperl=libperl.a gnulibc_version=’2.7’ Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=’-Wl,-E’ cccdlflags=’-fpic’, lddlflags=’-shared -L/usr/local/lib’
  29. 29. e errorCan’t load‘/home/sand/.cpan/build/JSON-YAJL- . -vYmtrJ-/blib/arch/auto/JSON/YAJL/Generator/Generator.so’for module JSON::YAJL::Generator:/home/sand/.cpan/build/JSON-YAJL- . -vYmtrJ-/blib/arch/auto/JSON/YAJL/Generator/Generator.so:unde ned symbol: newSVpvn_utf at/usr/local/perl- . . -threaded/lib/ . . /x _ -linux-thread-multi-ld/DynaLoader.pm line .
  30. 30. perlapi says Creates a new SV and copies a string into it. If utf is true, calls "SvUTF _on" on the new SV. SV* newSVpvn_utf8(NULLOK const char* s, STRLEN len, U32 utf8) Introduced in . , as pointed out by Andreas J. König.
  31. 31. Devel::PPPort - Perl/Pollution/Portability Perl’s API has changed over time, gaining new features, new functions, increasing its exibility, and reducing the impact on the C namespace environment (reduced pollution). e header le written by this module, typically ppport.h, attempts to bring some of the newer Perl API features to older versions of Perl, so that you can worry less about keeping track of old releases, but users can still reap the bene t.
  32. 32. Release . Include ppport.h . Mon Apr : : CEST
  33. 33. Release . Unde ned symbol "DPPP_my_newSVpvn_ ags"
  34. 34. Release . ( ) ppport.h is runnable #define NEED_newSVpvn_flags #define NEED_sv_2pv_flags
  35. 35. Release . ( ) do not include stdint.h as we do not need it . Tue Apr : : CEST
  36. 36. Release . got: . expected: . Stop using . for testing oats What Every Computer Scientist Should Know About Floating-Point Arithmetic — David Goldberg
  37. 37. Release . ( ) symbol isinf: referenced symbol not found #if defined (__SVR4) && defined (__sun) #ifndef isinf #include #define isinf(x) (!finite((x)) && (x)==(x)) #endif #endif
  38. 38. Release . ( ) Error: ’const char *’ not in typemap in Generator.xs, line add const char * to the typemap to support Perl .
  39. 39. Release . ( ) throw exceptions upon YAJL error states . Wed Apr : : CEST
  40. 40. Release . Half the tests failed! error: too few arguments to function ’Perl_croak’ use aTHX_ when Perl_croak-ing to work on threaded Perls Perl_croak(aTHX_ "YAJL: Keys must be strings");
  41. 41. Release . ( ) expecting: Regexp ((?-xism:Invalid number)) found: YAJL: Keys must be strings Only test inf and nan on Perl . . and later . u Apr : : CEST
  42. 42. Release . x minor documentation typo don’t test inf and nan under MSWin add an interface to the parser take advantage of typemaps and declarations to minimize XS code . Sat Apr : : CEST
  43. 43. Release . link to YAJL website, as pointed out by Olivier Mengué add homepage, repository and bugtracker distribution metadata add LICENSE le add a SAX builder example add a tokenising example add a tokenising, parsing with Marpa example improved documentation, clearer tests . Mon Apr : : CEST
  44. 44. Release . update to YAJL . . . Mon Jun : : BST
  45. 45. Release . don’t test inf and nan under MirOS BSD work around not nding isinf under Solaris work around missing sprintf_s under Windows . Wed Jul : : BST
  46. 46. Release . work aroud the fact that win mingw/gcc doesn’t have sprintf_s (for Strawberry Perl) move dSP to top of callback_call to compile under Microso Visual Studio . . u Aug : : BST
  47. 47. Microso Visual C++ does not support long long:yajlyajl_parse.h(77) : error C2632: ’long’ followed by ’long’ is illegalyajlyajl_parser.h(74) : error C2632: ’long’ followed by ’long’ is illegal
  48. 48. ...
  49. 49. How to become a CPAN Tester CPAN::Reporter http://wiki.cpantesters.org/
  50. 50. CPAN Testers Leaderboard st , , Chris Williams (BINGOS) nd , , Andreas J. König (ANDK) rd , Dan Collins (DCOLLINS) ... th , Léon Brocard (LBROCARD)
  51. 51. Summary , test reports perls platforms All helping to make CPAN modules more portable
  52. 52. On next at : Liel¯ z¯le: Perl Lists, Arrays, and Hashes vivi ed: a a lazy, in nite, at, slurpy, typed, bound, and LoL’d, Patrick Michaud Auditorija : Encryption on the Web for everyone, Lars D Auditorija : Terms of endearment — the ElasticSearch query language explained, Clinton Gormley Auditorija : Perlude: a taste of haskell in perl, Marc Chantreux
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×