@@ -17,6 +17,7 @@ package lib_test
17
17
18
18
import (
19
19
"encoding/json"
20
+ "fmt"
20
21
"io"
21
22
"net/http"
22
23
"strings"
@@ -26,6 +27,7 @@ import (
26
27
"github.com/arduino/go-paths-helper"
27
28
"github.com/stretchr/testify/require"
28
29
"go.bug.st/testifyjson/requirejson"
30
+ "gopkg.in/src-d/go-git.v4"
29
31
)
30
32
31
33
func TestLibUpgradeCommand (t * testing.T ) {
@@ -676,3 +678,349 @@ func TestUninstall(t *testing.T) {
676
678
_ , _ , err = cli .Run ("lib" , "uninstall" , libs [0 ], libs [1 ])
677
679
require .NoError (t , err )
678
680
}
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