@@ -676,7 +676,7 @@ generator Model{..} = oneof $ concat [
676
676
(rf, wf) = if fileExists then (10 ,3 ) else (1 ,3 )
677
677
678
678
genAllowExisting :: Gen AllowExisting
679
- genAllowExisting = elements [AllowExisting , MustBeNew ]
679
+ genAllowExisting = elements [AllowExisting , MustBeNew , MustExist ]
680
680
681
681
genSeekMode :: Gen SeekMode
682
682
genSeekMode = elements [
@@ -1004,84 +1004,107 @@ data Tag =
1004
1004
-- > Get ..
1005
1005
| TagPutTruncateGet
1006
1006
1007
- -- Close a handle 2 times
1007
+ -- | Close a handle 2 times
1008
1008
--
1009
1009
-- > h <- Open ..
1010
1010
-- > close h
1011
1011
-- > close h
1012
1012
| TagClosedTwice
1013
1013
1014
- -- Open an existing file with ReadMode and then with WriteMode
1014
+ -- | Open an existing file with ReadMode and then with WriteMode
1015
1015
--
1016
1016
-- > open fp ReadMode
1017
1017
-- > open fp Write
1018
1018
| TagOpenReadThenWrite
1019
1019
1020
- -- Open 2 Readers of a file.
1020
+ -- | Open 2 Readers of a file.
1021
1021
--
1022
1022
-- > open fp ReadMode
1023
1023
-- > open fp ReadMode
1024
1024
| TagOpenReadThenRead
1025
1025
1026
- -- ListDir on a non empty dirextory.
1026
+ -- | ListDir on a non empty dirextory.
1027
1027
--
1028
1028
-- > CreateDirIfMissing True a/b
1029
1029
-- > ListDirectory a
1030
1030
| TagCreateDirWithParentsThenListDirNotNull
1031
1031
1032
- -- Read from an AppendMode file
1032
+ -- | Read from an AppendMode file
1033
1033
--
1034
1034
-- > h <- Open fp AppendMode
1035
1035
-- > Read h ..
1036
1036
| TagReadInvalid
1037
1037
1038
- -- Write to a read only file
1038
+ -- | Write to a read only file
1039
1039
--
1040
1040
-- > h <- Open fp ReadMode
1041
1041
-- > Put h ..
1042
1042
| TagWriteInvalid
1043
1043
1044
- -- Put Seek and Get
1044
+ -- | Put Seek and Get
1045
1045
--
1046
1046
-- > Put ..
1047
1047
-- > Seek ..
1048
1048
-- > Get ..
1049
1049
| TagPutSeekGet
1050
1050
1051
- -- Put Seek (negative) and Get
1051
+ -- | Put Seek (negative) and Get
1052
1052
--
1053
1053
-- > Put ..
1054
1054
-- > Seek .. (negative)
1055
1055
-- > Get ..
1056
1056
| TagPutSeekNegGet
1057
1057
1058
- -- Open with MustBeNew (O_EXCL flag), but the file already existed.
1058
+ -- | Open with MustBeNew (O_EXCL flag), but the file already existed.
1059
1059
--
1060
1060
-- > h <- Open fp (AppendMode _)
1061
1061
-- > Close h
1062
1062
-- > Open fp (AppendMode MustBeNew)
1063
1063
| TagExclusiveFail
1064
1064
1065
+ -- | Open a file in read mode successfully
1066
+ --
1067
+ -- > h <- Open fp (WriteMode _)
1068
+ -- > Close h
1069
+ -- > h <- Open fp ReadMode
1070
+ | TagReadModeMustExist
1071
+
1072
+ -- | Open a file in read mode, but it fails because the file does not exist.
1073
+ --
1074
+ -- > h <- Open fp ReadMode
1075
+ | TagReadModeMustExistFail
1076
+
1077
+ -- | Open a file in non-read mode with 'MustExist' successfully.
1078
+ --
1079
+ -- > h <- Open fp (_ MustBeNew)
1080
+ -- > Close h
1081
+ -- > h <- Open fp (_ MustExist)
1082
+ | TagFileMustExist
1083
+
1084
+ -- | Open a file in non-read mode with 'MustExist', but it fails because the
1085
+ -- files does not exist.
1086
+ --
1087
+ -- > h <- Open fp (_ MustExist)
1088
+ | TagFileMustExistFail
1065
1089
1066
- -- Reading returns an empty bytestring when EOF
1090
+ -- | Reading returns an empty bytestring when EOF
1067
1091
--
1068
1092
-- > h <- open fp ReadMode
1069
1093
-- > Get h 1 == ""
1070
1094
| TagReadEOF
1071
1095
1072
-
1073
- -- GetAt
1096
+ -- | GetAt
1074
1097
--
1075
1098
-- > GetAt ...
1076
1099
| TagPread
1077
1100
1078
- -- Roundtrip for I/O with user-supplied buffers
1101
+ -- | Roundtrip for I/O with user-supplied buffers
1079
1102
--
1080
1103
-- > PutBuf h bs c
1081
1104
-- > GetBuf h c (==bs)
1082
1105
| TagPutGetBuf
1083
1106
1084
- -- Roundtrip for I/O with user-supplied buffers
1107
+ -- | Roundtrip for I/O with user-supplied buffers
1085
1108
--
1086
1109
-- > PutBufAt h bs c o
1087
1110
-- > GetBufAt h c o (==bs)
@@ -1136,6 +1159,10 @@ tag = C.classify [
1136
1159
, tagPutSeekGet Set. empty Set. empty
1137
1160
, tagPutSeekNegGet Set. empty Set. empty
1138
1161
, tagExclusiveFail
1162
+ , tagReadModeMustExist
1163
+ , tagReadModeMustExistFail
1164
+ , tagFileMustExist
1165
+ , tagFileMustExistFail
1139
1166
, tagReadEOF
1140
1167
, tagPread
1141
1168
, tagPutGetBuf Set. empty
@@ -1481,6 +1508,39 @@ tag = C.classify [
1481
1508
Left TagExclusiveFail
1482
1509
_otherwise -> Right tagExclusiveFail
1483
1510
1511
+ tagReadModeMustExist :: EventPred
1512
+ tagReadModeMustExist = C. predicate $ \ ev ->
1513
+ case (eventMockCmd ev, eventMockResp ev) of
1514
+ (Open _ ReadMode , Resp (Right (RHandle _))) -> Left TagReadModeMustExist
1515
+ _otherwise -> Right tagReadModeMustExist
1516
+
1517
+ tagReadModeMustExistFail :: EventPred
1518
+ tagReadModeMustExistFail = C. predicate $ \ ev ->
1519
+ case (eventMockCmd ev, eventMockResp ev) of
1520
+ (Open _ ReadMode , Resp (Left fsError))
1521
+ | fsErrorType fsError == FsResourceDoesNotExist ->
1522
+ Left TagReadModeMustExistFail
1523
+ _otherwise -> Right tagReadModeMustExistFail
1524
+
1525
+ tagFileMustExist :: EventPred
1526
+ tagFileMustExist = C. predicate $ \ ev ->
1527
+ case (eventMockCmd ev, eventMockResp ev) of
1528
+ (Open _ mode, Resp (Right (WHandle _ _)))
1529
+ | MustExist <- allowExisting mode
1530
+ , mode /= ReadMode
1531
+ -> Left TagFileMustExist
1532
+ _otherwise -> Right tagFileMustExist
1533
+
1534
+ tagFileMustExistFail :: EventPred
1535
+ tagFileMustExistFail = C. predicate $ \ ev ->
1536
+ case (eventMockCmd ev, eventMockResp ev) of
1537
+ (Open _ mode, Resp (Left fsError))
1538
+ | MustExist <- allowExisting mode
1539
+ , mode /= ReadMode
1540
+ , fsErrorType fsError == FsResourceDoesNotExist ->
1541
+ Left TagFileMustExistFail
1542
+ _otherwise -> Right tagFileMustExistFail
1543
+
1484
1544
tagReadEOF :: EventPred
1485
1545
tagReadEOF = successful $ \ ev suc ->
1486
1546
case (eventMockCmd ev, suc) of
0 commit comments