@@ -307,6 +307,92 @@ func TestDisableCreateRevisionsForFileInWorkspace(t *testing.T) {
307307 }
308308}
309309
310+ func TestConflictsForFileInWorkspace (t * testing.T ) {
311+ id , err := g .CreateWorkspace (context .Background (), "directory" )
312+ if err != nil {
313+ t .Fatalf ("Error creating workspace: %v" , err )
314+ }
315+
316+ t .Cleanup (func () {
317+ err := g .DeleteWorkspace (context .Background (), id )
318+ if err != nil {
319+ t .Errorf ("Error deleting workspace: %v" , err )
320+ }
321+ })
322+
323+ ce := (* ConflictInWorkspaceError )(nil )
324+ // Writing a new file with a non-zero latest revision should fail
325+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test0" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : "1" })
326+ if err == nil || ! errors .As (err , & ce ) {
327+ t .Errorf ("Expected error writing file with non-zero latest revision: %v" , err )
328+ }
329+
330+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test0" ), WriteFileInWorkspaceOptions {WorkspaceID : id })
331+ if err != nil {
332+ t .Fatalf ("Error creating file: %v" , err )
333+ }
334+
335+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test1" ), WriteFileInWorkspaceOptions {WorkspaceID : id })
336+ if err != nil {
337+ t .Fatalf ("Error creating file: %v" , err )
338+ }
339+
340+ revisions , err := g .ListRevisionsForFileInWorkspace (context .Background (), "test.txt" , ListRevisionsForFileInWorkspaceOptions {WorkspaceID : id })
341+ if err != nil {
342+ t .Errorf ("Error reading file: %v" , err )
343+ }
344+
345+ if len (revisions ) != 1 {
346+ t .Errorf ("Unexpected number of revisions: %d" , len (revisions ))
347+ }
348+
349+ // Writing to the file with the latest revision should succeed
350+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test2" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : revisions [0 ].RevisionID })
351+ if err != nil {
352+ t .Fatalf ("Error creating file: %v" , err )
353+ }
354+
355+ revisions , err = g .ListRevisionsForFileInWorkspace (context .Background (), "test.txt" , ListRevisionsForFileInWorkspaceOptions {WorkspaceID : id })
356+ if err != nil {
357+ t .Errorf ("Error reading file: %v" , err )
358+ }
359+
360+ if len (revisions ) != 2 {
361+ t .Errorf ("Unexpected number of revisions: %d" , len (revisions ))
362+ }
363+
364+ // Writing to the file with the same revision should fail
365+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test3" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : revisions [0 ].RevisionID })
366+ if err == nil || ! errors .As (err , & ce ) {
367+ t .Errorf ("Expected error writing file with same revision: %v" , err )
368+ }
369+
370+ err = g .DeleteRevisionForFileInWorkspace (context .Background (), "test.txt" , revisions [1 ].RevisionID , DeleteRevisionForFileInWorkspaceOptions {WorkspaceID : id })
371+ if err != nil {
372+ t .Errorf ("Error deleting revision for file: %v" , err )
373+ }
374+
375+ revisions , err = g .ListRevisionsForFileInWorkspace (context .Background (), "test.txt" , ListRevisionsForFileInWorkspaceOptions {WorkspaceID : id })
376+ if err != nil {
377+ t .Errorf ("Error reading file: %v" , err )
378+ }
379+
380+ if len (revisions ) != 1 {
381+ t .Errorf ("Unexpected number of revisions: %d" , len (revisions ))
382+ }
383+
384+ // Ensure we can write a new file after deleting the latest revision
385+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test4" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : revisions [0 ].RevisionID })
386+ if err != nil {
387+ t .Fatalf ("Error creating file: %v" , err )
388+ }
389+
390+ err = g .DeleteFileInWorkspace (context .Background (), "test.txt" , DeleteFileInWorkspaceOptions {WorkspaceID : id })
391+ if err != nil {
392+ t .Errorf ("Error deleting file: %v" , err )
393+ }
394+ }
395+
310396func TestLsComplexWorkspace (t * testing.T ) {
311397 id , err := g .CreateWorkspace (context .Background (), "directory" )
312398 if err != nil {
@@ -690,6 +776,96 @@ func TestRevisionsForFileInWorkspaceS3(t *testing.T) {
690776 }
691777}
692778
779+ func TestConflictsForFileInWorkspaceS3 (t * testing.T ) {
780+ if os .Getenv ("AWS_ACCESS_KEY_ID" ) == "" || os .Getenv ("AWS_SECRET_ACCESS_KEY" ) == "" || os .Getenv ("WORKSPACE_PROVIDER_S3_BUCKET" ) == "" {
781+ t .Skip ("Skipping test because AWS credentials are not set" )
782+ }
783+
784+ id , err := g .CreateWorkspace (context .Background (), "s3" )
785+ if err != nil {
786+ t .Fatalf ("Error creating workspace: %v" , err )
787+ }
788+
789+ t .Cleanup (func () {
790+ err := g .DeleteWorkspace (context .Background (), id )
791+ if err != nil {
792+ t .Errorf ("Error deleting workspace: %v" , err )
793+ }
794+ })
795+
796+ ce := (* ConflictInWorkspaceError )(nil )
797+ // Writing a new file with a non-zero latest revision should fail
798+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test0" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : "1" })
799+ if err == nil || ! errors .As (err , & ce ) {
800+ t .Errorf ("Expected error writing file with non-zero latest revision: %v" , err )
801+ }
802+
803+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test0" ), WriteFileInWorkspaceOptions {WorkspaceID : id })
804+ if err != nil {
805+ t .Fatalf ("Error creating file: %v" , err )
806+ }
807+
808+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test1" ), WriteFileInWorkspaceOptions {WorkspaceID : id })
809+ if err != nil {
810+ t .Fatalf ("Error creating file: %v" , err )
811+ }
812+
813+ revisions , err := g .ListRevisionsForFileInWorkspace (context .Background (), "test.txt" , ListRevisionsForFileInWorkspaceOptions {WorkspaceID : id })
814+ if err != nil {
815+ t .Errorf ("Error reading file: %v" , err )
816+ }
817+
818+ if len (revisions ) != 1 {
819+ t .Errorf ("Unexpected number of revisions: %d" , len (revisions ))
820+ }
821+
822+ // Writing to the file with the latest revision should succeed
823+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test2" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : revisions [0 ].RevisionID })
824+ if err != nil {
825+ t .Fatalf ("Error creating file: %v" , err )
826+ }
827+
828+ revisions , err = g .ListRevisionsForFileInWorkspace (context .Background (), "test.txt" , ListRevisionsForFileInWorkspaceOptions {WorkspaceID : id })
829+ if err != nil {
830+ t .Errorf ("Error reading file: %v" , err )
831+ }
832+
833+ if len (revisions ) != 2 {
834+ t .Errorf ("Unexpected number of revisions: %d" , len (revisions ))
835+ }
836+
837+ // Writing to the file with the same revision should fail
838+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test3" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : revisions [0 ].RevisionID })
839+ if err == nil || ! errors .As (err , & ce ) {
840+ t .Errorf ("Expected error writing file with same revision: %v" , err )
841+ }
842+
843+ err = g .DeleteRevisionForFileInWorkspace (context .Background (), "test.txt" , revisions [1 ].RevisionID , DeleteRevisionForFileInWorkspaceOptions {WorkspaceID : id })
844+ if err != nil {
845+ t .Errorf ("Error deleting revision for file: %v" , err )
846+ }
847+
848+ revisions , err = g .ListRevisionsForFileInWorkspace (context .Background (), "test.txt" , ListRevisionsForFileInWorkspaceOptions {WorkspaceID : id })
849+ if err != nil {
850+ t .Errorf ("Error reading file: %v" , err )
851+ }
852+
853+ if len (revisions ) != 1 {
854+ t .Errorf ("Unexpected number of revisions: %d" , len (revisions ))
855+ }
856+
857+ // Ensure we can write a new file after deleting the latest revision
858+ err = g .WriteFileInWorkspace (context .Background (), "test.txt" , []byte ("test4" ), WriteFileInWorkspaceOptions {WorkspaceID : id , LatestRevision : revisions [0 ].RevisionID })
859+ if err != nil {
860+ t .Fatalf ("Error creating file: %v" , err )
861+ }
862+
863+ err = g .DeleteFileInWorkspace (context .Background (), "test.txt" , DeleteFileInWorkspaceOptions {WorkspaceID : id })
864+ if err != nil {
865+ t .Errorf ("Error deleting file: %v" , err )
866+ }
867+ }
868+
693869func TestDisableCreatingRevisionsForFileInWorkspaceS3 (t * testing.T ) {
694870 if os .Getenv ("AWS_ACCESS_KEY_ID" ) == "" || os .Getenv ("AWS_SECRET_ACCESS_KEY" ) == "" || os .Getenv ("WORKSPACE_PROVIDER_S3_BUCKET" ) == "" {
695871 t .Skip ("Skipping test because AWS credentials are not set" )
0 commit comments