@@ -51,11 +51,14 @@ const (
51
51
CURRENT_CONTAINER = "GoSwiftUnitTestCurrent"
52
52
OBJECT = "test_object"
53
53
OBJECT2 = "test_object2"
54
+ SYMLINK_OBJECT = "test_symlink"
55
+ SYMLINK_OBJECT2 = "test_symlink2"
54
56
EMPTYOBJECT = "empty_test_object"
55
57
CONTENTS = "12345"
56
58
CONTENTS2 = "54321"
57
59
CONTENT_SIZE = int64 (len (CONTENTS ))
58
60
CONTENT_MD5 = "827ccb0eea8a706c4c34a16891f84e7b"
61
+ CONTENT2_MD5 = "01cfcd4f6b8770febfb40cb906715822"
59
62
EMPTY_MD5 = "d41d8cd98f00b204e9800998ecf8427e"
60
63
SECRET_KEY = "b3968d0207b54ece87cccc06515a89d4"
61
64
)
@@ -299,6 +302,12 @@ func isV3Api() bool {
299
302
return strings .Contains (AuthUrl , "v3" )
300
303
}
301
304
305
+ func getSwinftInfo (t * testing.T ) (info swift.SwiftInfo , err error ) {
306
+ c , rollback := makeConnectionAuth (t )
307
+ defer rollback ()
308
+ return c .QueryInfo ()
309
+ }
310
+
302
311
func TestTransport (t * testing.T ) {
303
312
c , rollback := makeConnection (t )
304
313
defer rollback ()
@@ -908,6 +917,122 @@ func TestObjectEmpty(t *testing.T) {
908
917
}
909
918
}
910
919
920
+ func TestSymlinkObject (t * testing.T ) {
921
+ info , err := getSwinftInfo (t )
922
+ if err != nil {
923
+ t .Fatal (err )
924
+ }
925
+ if _ , ok := info ["symlink" ]; ! ok {
926
+ // skip, symlink not supported
927
+ t .Skip ("skip, symlink not supported" )
928
+ return
929
+ }
930
+ c , rollback := makeConnectionWithContainer (t )
931
+ defer rollback ()
932
+
933
+ // write target objects
934
+ err = c .ObjectPutBytes (CONTAINER , OBJECT , []byte (CONTENTS ), "text/potato" )
935
+ if err != nil {
936
+ t .Fatal (err )
937
+ }
938
+ defer func () {
939
+ err = c .ObjectDelete (CONTAINER , OBJECT )
940
+ if err != nil {
941
+ t .Error (err )
942
+ }
943
+ }()
944
+
945
+ // test dynamic link
946
+ _ , err = c .ObjectSymlinkCreate (CONTAINER , SYMLINK_OBJECT , "" , CONTAINER , OBJECT , "" )
947
+ if err != nil {
948
+ t .Fatal (err )
949
+ }
950
+ defer func () {
951
+ err = c .ObjectDelete (CONTAINER , SYMLINK_OBJECT )
952
+ if err != nil {
953
+ t .Error (err )
954
+ }
955
+ }()
956
+
957
+ md , _ , err := c .Object (CONTAINER , SYMLINK_OBJECT )
958
+ if err != nil {
959
+ t .Error (err )
960
+ }
961
+ if md .ContentType != "text/potato" {
962
+ t .Error ("Bad content type" , md .ContentType )
963
+ }
964
+ if md .Bytes != CONTENT_SIZE {
965
+ t .Errorf ("Bad length want 5 got %v" , md .Bytes )
966
+ }
967
+ if md .Hash != CONTENT_MD5 {
968
+ t .Errorf ("Bad MD5 want %v got %v" , CONTENT_MD5 , md .Hash )
969
+ }
970
+
971
+ }
972
+
973
+ func TestStaticSymlinkObject (t * testing.T ) {
974
+ info , err := getSwinftInfo (t )
975
+ if err != nil {
976
+ t .Fatal (err )
977
+ }
978
+ if sym , ok := info ["symlink" ].(map [string ]interface {}); ok {
979
+ if _ , ok := sym ["static_links" ]; ! ok {
980
+ t .Skip ("skip, static symlink not supported" )
981
+ return
982
+ }
983
+ } else {
984
+ t .Skip ("skip, symlink not supported" )
985
+ return
986
+ }
987
+
988
+ c , rollback := makeConnectionWithContainer (t )
989
+ defer rollback ()
990
+
991
+ // write target objects
992
+ err = c .ObjectPutBytes (CONTAINER , OBJECT2 , []byte (CONTENTS2 ), "text/tomato" )
993
+ if err != nil {
994
+ t .Fatal (err )
995
+ }
996
+ defer func () {
997
+ err = c .ObjectDelete (CONTAINER , OBJECT2 )
998
+ if err != nil {
999
+ t .Error (err )
1000
+ }
1001
+ }()
1002
+
1003
+ // test static link
1004
+ // first with the wrong target etag
1005
+ _ , err = c .ObjectSymlinkCreate (CONTAINER , SYMLINK_OBJECT2 , "" , CONTAINER , OBJECT2 , CONTENT_MD5 )
1006
+ if err == nil {
1007
+ t .Error ("Symlink with wrong target etag should have failed" )
1008
+ }
1009
+
1010
+ _ , err = c .ObjectSymlinkCreate (CONTAINER , SYMLINK_OBJECT2 , "" , CONTAINER , OBJECT2 , CONTENT2_MD5 )
1011
+ if err != nil {
1012
+ t .Fatal (err )
1013
+ }
1014
+ defer func () {
1015
+ err = c .ObjectDelete (CONTAINER , SYMLINK_OBJECT2 )
1016
+ if err != nil {
1017
+ t .Error (err )
1018
+ }
1019
+ }()
1020
+
1021
+ md , _ , err := c .Object (CONTAINER , SYMLINK_OBJECT2 )
1022
+ if err != nil {
1023
+ t .Error (err )
1024
+ }
1025
+ if md .ContentType != "text/tomato" {
1026
+ t .Error ("Bad content type" , md .ContentType )
1027
+ }
1028
+ if md .Bytes != CONTENT_SIZE {
1029
+ t .Errorf ("Bad length want 5 got %v" , md .Bytes )
1030
+ }
1031
+ if md .Hash != CONTENT2_MD5 {
1032
+ t .Errorf ("Bad MD5 want %v got %v" , CONTENT2_MD5 , md .Hash )
1033
+ }
1034
+ }
1035
+
911
1036
func TestObjectPutBytes (t * testing.T ) {
912
1037
c , rollback := makeConnectionWithContainer (t )
913
1038
defer rollback ()
0 commit comments