@@ -17,6 +17,7 @@ package lib_test
1717
1818import (
1919 "encoding/json"
20+ "fmt"
2021 "io"
2122 "net/http"
2223 "strings"
@@ -26,6 +27,7 @@ import (
2627 "github.com/arduino/go-paths-helper"
2728 "github.com/stretchr/testify/require"
2829 "go.bug.st/testifyjson/requirejson"
30+ "gopkg.in/src-d/go-git.v4"
2931)
3032
3133func TestLibUpgradeCommand (t * testing.T ) {
@@ -676,3 +678,349 @@ func TestUninstall(t *testing.T) {
676678 _ , _ , err = cli .Run ("lib" , "uninstall" , libs [0 ], libs [1 ])
677679 require .NoError (t , err )
678680}
681+
682+ func TestUninstallSpaces (t * testing.T ) {
683+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
684+ defer env .CleanUp ()
685+
686+ key := "LiquidCrystal I2C"
687+ _ , _ , err := cli .Run ("lib" , "install" , key )
688+ require .NoError (t , err )
689+ _ , _ , err = cli .Run ("lib" , "uninstall" , key )
690+ require .NoError (t , err )
691+ stdout , _ , err := cli .Run ("lib" , "list" , "--format" , "json" )
692+ require .NoError (t , err )
693+ requirejson .Len (t , stdout , 0 )
694+ }
695+
696+ func TestLibOpsCaseInsensitive (t * testing.T ) {
697+ /*This test is supposed to (un)install the following library,
698+ As you can see the name is all caps:
699+
700+ Name: "PCM"
701+ Author: David Mellis <d.mellis@bcmi-labs.cc>, Michael Smith <michael@hurts.ca>
702+ Maintainer: David Mellis <d.mellis@bcmi-labs.cc>
703+ Sentence: Playback of short audio samples.
704+ Paragraph: These samples are encoded directly in the Arduino sketch as an array of numbers.
705+ Website: http://highlowtech.org/?p=1963
706+ Category: Signal Input/Output
707+ Architecture: avr
708+ Types: Contributed
709+ Versions: [1.0.0]*/
710+
711+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
712+ defer env .CleanUp ()
713+
714+ key := "pcm"
715+ _ , _ , err := cli .Run ("lib" , "install" , key )
716+ require .NoError (t , err )
717+ _ , _ , err = cli .Run ("lib" , "uninstall" , key )
718+ require .NoError (t , err )
719+ stdout , _ , err := cli .Run ("lib" , "list" , "--format" , "json" )
720+ require .NoError (t , err )
721+ requirejson .Len (t , stdout , 0 )
722+ }
723+
724+ func TestSearch (t * testing.T ) {
725+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
726+ defer env .CleanUp ()
727+
728+ stdout , _ , err := cli .Run ("lib" , "search" , "--names" )
729+ require .NoError (t , err )
730+ lines := strings .Split (strings .TrimSpace (string (stdout )), "\n " )
731+ var libs []string
732+ for i , v := range lines {
733+ lines [i ] = strings .TrimSpace (v )
734+ if strings .Contains (v , "Name:" ) {
735+ libs = append (libs , strings .Trim (strings .SplitN (v , " " , 2 )[1 ], "\" " ))
736+ }
737+ }
738+
739+ expected := []string {"WiFi101" , "WiFi101OTA" , "Firebase Arduino based on WiFi101" , "WiFi101_Generic" }
740+ require .Subset (t , libs , expected )
741+
742+ stdout , _ , err = cli .Run ("lib" , "search" , "--names" , "--format" , "json" )
743+ require .NoError (t , err )
744+ requirejson .Query (t , stdout , ".libraries | length" , fmt .Sprint (len (libs )))
745+
746+ runSearch := func (args string , expectedLibs []string ) {
747+ stdout , _ , err = cli .Run ("lib" , "search" , "--names" , "--format" , "json" , args )
748+ require .NoError (t , err )
749+ libraries := requirejson .Parse (t , stdout ).Query ("[ .libraries | .[] | .name ]" ).String ()
750+ for _ , l := range expectedLibs {
751+ require .Contains (t , libraries , l )
752+ }
753+ }
754+ runSearch ("Arduino_MKRIoTCarrier" , []string {"Arduino_MKRIoTCarrier" })
755+ runSearch ("Arduino mkr iot carrier" , []string {"Arduino_MKRIoTCarrier" })
756+ runSearch ("mkr iot carrier" , []string {"Arduino_MKRIoTCarrier" })
757+ runSearch ("mkriotcarrier" , []string {"Arduino_MKRIoTCarrier" })
758+ runSearch ("dht" , []string {"DHT sensor library" , "DHT sensor library for ESPx" , "DHT12" , "SimpleDHT" , "TinyDHT sensor library" , "SDHT" })
759+ runSearch ("dht11" , []string {"DHT sensor library" , "DHT sensor library for ESPx" , "SimpleDHT" , "SDHT" })
760+ runSearch ("dht12" , []string {"DHT12" , "DHT12 sensor library" , "SDHT" })
761+ runSearch ("dht22" , []string {"DHT sensor library" , "DHT sensor library for ESPx" , "SimpleDHT" , "SDHT" })
762+ runSearch ("dht sensor" , []string {"DHT sensor library" , "DHT sensor library for ESPx" , "SimpleDHT" , "SDHT" })
763+ runSearch ("sensor dht" , []string {})
764+ runSearch ("arduino json" , []string {"ArduinoJson" , "Arduino_JSON" })
765+ runSearch ("arduinojson" , []string {"ArduinoJson" })
766+ runSearch ("json" , []string {"ArduinoJson" , "Arduino_JSON" })
767+ }
768+
769+ func TestSearchParagraph (t * testing.T ) {
770+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
771+ defer env .CleanUp ()
772+
773+ // Search for a string that's only present in the `paragraph` field
774+ // within the index file.
775+ _ , _ , err := cli .Run ("lib" , "update-index" )
776+ require .NoError (t , err )
777+ stdout , _ , err := cli .Run ("lib" , "search" , "A simple and efficient JSON library" , "--names" , "--format" , "json" )
778+ require .NoError (t , err )
779+ requirejson .Contains (t , stdout , `{
780+ "libraries": [
781+ {
782+ "name": "ArduinoJson"
783+ }
784+ ]
785+ }` )
786+ }
787+
788+ func TestLibListWithUpdatableFlag (t * testing.T ) {
789+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
790+ defer env .CleanUp ()
791+
792+ // Init the environment explicitly
793+ _ , _ , err := cli .Run ("lib" , "update-index" )
794+ require .NoError (t , err )
795+
796+ // No libraries to update
797+ stdout , stderr , err := cli .Run ("lib" , "list" , "--updatable" )
798+ require .NoError (t , err )
799+ require .Empty (t , stderr )
800+ require .Contains (t , string (stdout ), "No libraries update is available." )
801+ // No library to update in json
802+ stdout , stderr , err = cli .Run ("lib" , "list" , "--updatable" , "--format" , "json" )
803+ require .NoError (t , err )
804+ require .Empty (t , stderr )
805+ requirejson .Empty (t , stdout )
806+
807+ // Install outdated library
808+ _ , _ , err = cli .Run ("lib" , "install" , "ArduinoJson@6.11.0" )
809+ require .NoError (t , err )
810+ // Install latest version of library
811+ _ , _ , err = cli .Run ("lib" , "install" , "WiFi101" )
812+ require .NoError (t , err )
813+
814+ stdout , stderr , err = cli .Run ("lib" , "list" , "--updatable" )
815+ require .NoError (t , err )
816+ require .Empty (t , stderr )
817+ var lines [][]string
818+ for _ , v := range strings .Split (strings .TrimSpace (string (stdout )), "\n " ) {
819+ v = strings .Join (strings .Fields (v ), " " )
820+ lines = append (lines , strings .SplitN (v , " " , 5 ))
821+ }
822+ require .Len (t , lines , 2 )
823+ require .Subset (t , lines [0 ], []string {"Name" , "Installed" , "Available" , "Location" , "Description" })
824+ require .Equal (t , "ArduinoJson" , lines [1 ][0 ])
825+ require .Equal (t , "6.11.0" , lines [1 ][1 ])
826+ // Verifies available version is not equal to installed one and not empty
827+ require .NotEqual (t , "6.11.0" , lines [1 ][2 ])
828+ require .NotEmpty (t , lines [1 ][2 ])
829+ require .Equal (t , "An efficient and elegant JSON library..." , lines [1 ][4 ])
830+
831+ // Look at the JSON output
832+ stdout , stderr , err = cli .Run ("lib" , "list" , "--updatable" , "--format" , "json" )
833+ require .NoError (t , err )
834+ require .Empty (t , stderr )
835+ requirejson .Len (t , stdout , 1 )
836+ // be sure data contains the available version
837+ requirejson .Query (t , stdout , `.[0] | .library | .version` , `"6.11.0"` )
838+ requirejson .Query (t , stdout , `.[0] | .release | .version != "6.11.0"` , `true` )
839+ requirejson .Query (t , stdout , `.[0] | .release | .version != ""` , `true` )
840+ }
841+
842+ func TestInstallWithGitUrlFromCurrentDirectory (t * testing.T ) {
843+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
844+ defer env .CleanUp ()
845+
846+ _ , _ , err := cli .Run ("update" )
847+ require .NoError (t , err )
848+
849+ envVar := cli .GetDefaultEnv ()
850+ envVar ["ARDUINO_ENABLE_UNSAFE_LIBRARY_INSTALL" ] = "true"
851+
852+ libInstallDir := cli .SketchbookDir ().Join ("libraries" , "WiFi101" )
853+ // Verifies library is not installed
854+ require .NoDirExists (t , libInstallDir .String ())
855+
856+ // Clone repository locally
857+ gitUrl := "https://github.com/arduino-libraries/WiFi101.git"
858+ repoDir := cli .SketchbookDir ().Join ("WiFi101" )
859+ _ , err = git .PlainClone (repoDir .String (), false , & git.CloneOptions {
860+ URL : gitUrl ,
861+ })
862+ require .NoError (t , err )
863+
864+ cli .SetWorkingDir (repoDir )
865+ _ , _ , err = cli .RunWithCustomEnv (envVar , "lib" , "install" , "--git-url" , "." )
866+ require .NoError (t , err )
867+
868+ // Verifies library is installed to correct folder
869+ require .DirExists (t , libInstallDir .String ())
870+ }
871+
872+ func TestInstallWithGitLocalUrl (t * testing.T ) {
873+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
874+ defer env .CleanUp ()
875+
876+ _ , _ , err := cli .Run ("update" )
877+ require .NoError (t , err )
878+
879+ envVar := cli .GetDefaultEnv ()
880+ envVar ["ARDUINO_ENABLE_UNSAFE_LIBRARY_INSTALL" ] = "true"
881+
882+ libInstallDir := cli .SketchbookDir ().Join ("libraries" , "WiFi101" )
883+ // Verifies library is not installed
884+ require .NoDirExists (t , libInstallDir .String ())
885+
886+ // Clone repository locally
887+ gitUrl := "https://github.com/arduino-libraries/WiFi101.git"
888+ repoDir := cli .SketchbookDir ().Join ("WiFi101" )
889+ _ , err = git .PlainClone (repoDir .String (), false , & git.CloneOptions {
890+ URL : gitUrl ,
891+ })
892+ require .NoError (t , err )
893+
894+ _ , _ , err = cli .RunWithCustomEnv (envVar , "lib" , "install" , "--git-url" , repoDir .String ())
895+ require .NoError (t , err )
896+
897+ // Verifies library is installed
898+ require .DirExists (t , libInstallDir .String ())
899+ }
900+
901+ func TestInstallWithGitUrlRelativePath (t * testing.T ) {
902+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
903+ defer env .CleanUp ()
904+
905+ _ , _ , err := cli .Run ("update" )
906+ require .NoError (t , err )
907+
908+ envVar := cli .GetDefaultEnv ()
909+ envVar ["ARDUINO_ENABLE_UNSAFE_LIBRARY_INSTALL" ] = "true"
910+
911+ libInstallDir := cli .SketchbookDir ().Join ("libraries" , "WiFi101" )
912+ // Verifies library is not installed
913+ require .NoDirExists (t , libInstallDir .String ())
914+
915+ // Clone repository locally
916+ gitUrl := "https://github.com/arduino-libraries/WiFi101.git"
917+ repoDir := cli .SketchbookDir ().Join ("WiFi101" )
918+ _ , err = git .PlainClone (repoDir .String (), false , & git.CloneOptions {
919+ URL : gitUrl ,
920+ })
921+ require .NoError (t , err )
922+
923+ cli .SetWorkingDir (cli .SketchbookDir ())
924+ _ , _ , err = cli .RunWithCustomEnv (envVar , "lib" , "install" , "--git-url" , "./WiFi101" )
925+ require .NoError (t , err )
926+
927+ // Verifies library is installed
928+ require .DirExists (t , libInstallDir .String ())
929+ }
930+
931+ func TestInstallWithGitUrlDoesNotCreateGitRepo (t * testing.T ) {
932+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
933+ defer env .CleanUp ()
934+
935+ _ , _ , err := cli .Run ("update" )
936+ require .NoError (t , err )
937+
938+ envVar := cli .GetDefaultEnv ()
939+ envVar ["ARDUINO_ENABLE_UNSAFE_LIBRARY_INSTALL" ] = "true"
940+
941+ libInstallDir := cli .SketchbookDir ().Join ("libraries" , "WiFi101" )
942+ // Verifies library is not installed
943+ require .NoDirExists (t , libInstallDir .String ())
944+
945+ // Clone repository locally
946+ gitUrl := "https://github.com/arduino-libraries/WiFi101.git"
947+ repoDir := cli .SketchbookDir ().Join ("WiFi101" )
948+ _ , err = git .PlainClone (repoDir .String (), false , & git.CloneOptions {
949+ URL : gitUrl ,
950+ })
951+ require .NoError (t , err )
952+
953+ _ , _ , err = cli .RunWithCustomEnv (envVar , "lib" , "install" , "--git-url" , repoDir .String ())
954+ require .NoError (t , err )
955+
956+ // Verifies installed library is not a git repository
957+ require .NoDirExists (t , libInstallDir .Join (".git" ).String ())
958+ }
959+
960+ func TestInstallWithGitUrlMultipleLibraries (t * testing.T ) {
961+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
962+ defer env .CleanUp ()
963+
964+ _ , _ , err := cli .Run ("update" )
965+ require .NoError (t , err )
966+
967+ envVar := cli .GetDefaultEnv ()
968+ envVar ["ARDUINO_ENABLE_UNSAFE_LIBRARY_INSTALL" ] = "true"
969+
970+ wifiInstallDir := cli .SketchbookDir ().Join ("libraries" , "WiFi101" )
971+ bleInstallDir := cli .SketchbookDir ().Join ("libraries" , "ArduinoBLE" )
972+ // Verifies library are not installed
973+ require .NoDirExists (t , wifiInstallDir .String ())
974+ require .NoDirExists (t , bleInstallDir .String ())
975+
976+ wifiUrl := "https://github.com/arduino-libraries/WiFi101.git"
977+ bleUrl := "https://github.com/arduino-libraries/ArduinoBLE.git"
978+
979+ _ , _ , err = cli .RunWithCustomEnv (envVar , "lib" , "install" , "--git-url" , wifiUrl , bleUrl )
980+ require .NoError (t , err )
981+
982+ // Verifies library are installed
983+ require .DirExists (t , wifiInstallDir .String ())
984+ require .DirExists (t , bleInstallDir .String ())
985+ }
986+
987+ func TestLibExamples (t * testing.T ) {
988+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
989+ defer env .CleanUp ()
990+
991+ _ , _ , err := cli .Run ("update" )
992+ require .NoError (t , err )
993+
994+ _ , _ , err = cli .Run ("lib" , "install" , "Arduino_JSON@0.1.0" )
995+ require .NoError (t , err )
996+
997+ stdout , _ , err := cli .Run ("lib" , "examples" , "Arduino_JSON" , "--format" , "json" )
998+ require .NoError (t , err )
999+ requirejson .Len (t , stdout , 1 )
1000+ examples := requirejson .Parse (t , stdout ).Query (".[0] | .examples" ).String ()
1001+ examples = strings .ReplaceAll (examples , "\\ \\ " , "\\ " )
1002+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Arduino_JSON" , "examples" , "JSONArray" ).String ())
1003+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Arduino_JSON" , "examples" , "JSONKitchenSink" ).String ())
1004+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Arduino_JSON" , "examples" , "JSONObject" ).String ())
1005+ }
1006+
1007+ func TestLibExamplesWithPdeFile (t * testing.T ) {
1008+ env , cli := integrationtest .CreateArduinoCLIWithEnvironment (t )
1009+ defer env .CleanUp ()
1010+
1011+ _ , _ , err := cli .Run ("update" )
1012+ require .NoError (t , err )
1013+
1014+ _ , _ , err = cli .Run ("lib" , "install" , "Encoder@1.4.1" )
1015+ require .NoError (t , err )
1016+
1017+ stdout , _ , err := cli .Run ("lib" , "examples" , "Encoder" , "--format" , "json" )
1018+ require .NoError (t , err )
1019+ requirejson .Len (t , stdout , 1 )
1020+ examples := requirejson .Parse (t , stdout ).Query (".[0] | .examples" ).String ()
1021+ examples = strings .ReplaceAll (examples , "\\ \\ " , "\\ " )
1022+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Encoder" , "examples" , "Basic" ).String ())
1023+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Encoder" , "examples" , "NoInterrupts" ).String ())
1024+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Encoder" , "examples" , "SpeedTest" ).String ())
1025+ require .Contains (t , examples , cli .SketchbookDir ().Join ("libraries" , "Encoder" , "examples" , "TwoKnobs" ).String ())
1026+ }
0 commit comments