@@ -24,8 +24,12 @@ test_set_port GIT_TEST_GVFS_PROTOCOL_PORT
24
24
# actually use it). We are only testing explicit object
25
25
# fetching using gvfs-helper.exe in isolation.
26
26
#
27
+ # repo_t2:
28
+ # Another empty repo to use after we contaminate t1.
29
+ #
27
30
REPO_SRC=" $( pwd) " /repo_src
28
31
REPO_T1=" $( pwd) " /repo_t1
32
+ REPO_T2=" $( pwd) " /repo_t2
29
33
30
34
# Setup some loopback URLs where test-gvfs-protocol.exe will be
31
35
# listening. We will spawn it directly inside the repo_src directory,
@@ -45,6 +49,7 @@ ORIGIN_URL=http://$HOST_PORT/servertype/origin
45
49
CACHE_URL=http://$HOST_PORT /servertype/cache
46
50
47
51
SHARED_CACHE_T1=" $( pwd) " /shared_cache_t1
52
+ SHARED_CACHE_T2=" $( pwd) " /shared_cache_t2
48
53
49
54
# The pid-file is created by test-gvfs-protocol.exe when it starts.
50
55
# The server will shut down if/when we delete it. (This is a little
@@ -182,6 +187,10 @@ test_expect_success 'setup repos' '
182
187
mkdir "$SHARED_CACHE_T1/pack" &&
183
188
mkdir "$SHARED_CACHE_T1/info" &&
184
189
#
190
+ mkdir "$SHARED_CACHE_T2" &&
191
+ mkdir "$SHARED_CACHE_T2/pack" &&
192
+ mkdir "$SHARED_CACHE_T2/info" &&
193
+ #
185
194
# setup repo_t1 and point all of the gvfs.* values to repo_src.
186
195
#
187
196
test_create_repo "$REPO_T1" &&
@@ -191,6 +200,13 @@ test_expect_success 'setup repos' '
191
200
git -C "$REPO_T1" config --local gvfs.sharedCache "$SHARED_CACHE_T1" &&
192
201
echo "$SHARED_CACHE_T1" >> "$REPO_T1"/.git/objects/info/alternates &&
193
202
#
203
+ test_create_repo "$REPO_T2" &&
204
+ git -C "$REPO_T2" branch -M main &&
205
+ git -C "$REPO_T2" remote add origin $ORIGIN_URL &&
206
+ git -C "$REPO_T2" config --local gvfs.cache-server $CACHE_URL &&
207
+ git -C "$REPO_T2" config --local gvfs.sharedCache "$SHARED_CACHE_T2" &&
208
+ echo "$SHARED_CACHE_T2" >> "$REPO_T2"/.git/objects/info/alternates &&
209
+ #
194
210
#
195
211
#
196
212
cat <<-EOF >creds.txt &&
@@ -203,6 +219,7 @@ test_expect_success 'setup repos' '
203
219
EOF
204
220
chmod 755 creds.sh &&
205
221
git -C "$REPO_T1" config --local credential.helper "!f() { cat \"$(pwd)\"/creds.txt; }; f" &&
222
+ git -C "$REPO_T2" config --local credential.helper "!f() { cat \"$(pwd)\"/creds.txt; }; f" &&
206
223
#
207
224
# Create some test data sets.
208
225
#
@@ -1036,6 +1053,70 @@ test_expect_success 'successful retry after http-error: origin get' '
1036
1053
verify_connection_count 2
1037
1054
'
1038
1055
1056
+ # ################################################################
1057
+ # So far we have confirmed that gvfs-helper can recover from a network
1058
+ # error (with retries, since the cache-server was disabled in all of
1059
+ # the above tests). Try again with fallback turned on.
1060
+ #
1061
+ # With mayhem "http_503" turned on both the cache and origin server
1062
+ # will always throw a 503 error.
1063
+ #
1064
+ # Confirm that we tried to make six connections: we should hit the
1065
+ # cache-server 3 times (one initial attempt and two retries) and then
1066
+ # try the origin server 3 times.
1067
+ #
1068
+ # ################################################################
1069
+
1070
+ test_expect_success ' http-error: 503 Service Unavailable (with retry and fallback)' '
1071
+ test_when_finished "per_test_cleanup" &&
1072
+ start_gvfs_protocol_server_with_mayhem http_503 &&
1073
+
1074
+ test_expect_code $GH__ERROR_CODE__HTTP_503 \
1075
+ git -C "$REPO_T1" gvfs-helper \
1076
+ --cache-server=trust \
1077
+ --remote=origin \
1078
+ --fallback \
1079
+ get \
1080
+ --max-retries=2 \
1081
+ <"$OIDS_FILE" >OUT.output 2>OUT.stderr &&
1082
+
1083
+ stop_gvfs_protocol_server &&
1084
+
1085
+ grep -q "error: get: (http:503)" OUT.stderr &&
1086
+ verify_connection_count 6
1087
+ '
1088
+
1089
+ # ################################################################
1090
+ # Now repeat the above, but explicitly turn off fallback.
1091
+ #
1092
+ # Again, we use mayhem "http_503". However, with fallback turned
1093
+ # off, we will only attempt the 3 connections to the cache server.
1094
+ # We will not try to hit the origin server.
1095
+ #
1096
+ # So we should only see a total of 3 connections rather than the
1097
+ # six in the previous test.
1098
+ #
1099
+ # ################################################################
1100
+
1101
+ test_expect_success ' http-error: 503 Service Unavailable (with retry and no-fallback)' '
1102
+ test_when_finished "per_test_cleanup" &&
1103
+ start_gvfs_protocol_server_with_mayhem http_503 &&
1104
+
1105
+ test_expect_code $GH__ERROR_CODE__HTTP_503 \
1106
+ git -C "$REPO_T1" gvfs-helper \
1107
+ --cache-server=trust \
1108
+ --remote=origin \
1109
+ --no-fallback \
1110
+ get \
1111
+ --max-retries=2 \
1112
+ <"$OIDS_FILE" >OUT.output 2>OUT.stderr &&
1113
+
1114
+ stop_gvfs_protocol_server &&
1115
+
1116
+ grep -q "error: get: (http:503)" OUT.stderr &&
1117
+ verify_connection_count 3
1118
+ '
1119
+
1039
1120
# ################################################################
1040
1121
# Test HTTP Auth
1041
1122
#
@@ -1193,6 +1274,87 @@ test_expect_success 'integration: fully implicit: diff 2 commits' '
1193
1274
>OUT.output 2>OUT.stderr
1194
1275
'
1195
1276
1277
+ # T1 should be considered contaminated at this point.
1278
+
1279
+ # ################################################################
1280
+ # gvfs-helper.exe defaults to no fallback.
1281
+ # gvfs-helper-client.c defaults to adding `--fallback` to child process.
1282
+ #
1283
+ # `gvfs.fallback` was added to change the default behavior in the
1284
+ # gvfs-helper-client.c code to add either `--fallback` or `--no-fallback`
1285
+ # (for origin server load reasons).
1286
+ #
1287
+ # When `gvfs.fallback` is unset, we default to TRUE and pass `--fallback`.
1288
+ # Otherwise, we use the boolean value to decide.
1289
+ #
1290
+ # NOTE: We DO NOT attempt to count connection requests in the
1291
+ # following tests. Since we are using a normal `git` command to drive
1292
+ # the `gvfs-helper-client.c` code (and spawn `git-gvfs-helper.exe`) we
1293
+ # cannot make assumptions on the number of child processes or
1294
+ # reqeusts. The "promisor" logic may drive one or more single-item
1295
+ # GETs or a series of bulk POST attempts. Therefore, we must rely
1296
+ # only on the result of the command and (implicitly) whether all
1297
+ # missing objects were resolved. We use mayhem features to selectively
1298
+ # break the cache and origin servers.
1299
+ # ################################################################
1300
+
1301
+ test_expect_success ' integration: implicit-get: http_503: diff 2 commits' '
1302
+ test_when_finished "per_test_cleanup" &&
1303
+
1304
+ # Tell both servers to always send 503.
1305
+ start_gvfs_protocol_server_with_mayhem http_503 &&
1306
+
1307
+ # Implicitly demand-load everything without any pre-seeding.
1308
+ # (We cannot tell from whether fallback was used or not in this
1309
+ # limited test.)
1310
+ #
1311
+ test_must_fail \
1312
+ git -C "$REPO_T2" -c core.useGVFSHelper=true \
1313
+ diff $(cat m1.branch)..$(cat m3.branch) \
1314
+ >OUT.output 2>OUT.stderr &&
1315
+
1316
+ stop_gvfs_protocol_server
1317
+ '
1318
+
1319
+ test_expect_success ' integration: implicit-get: cache_http_503,no-fallback: diff 2 commits' '
1320
+ test_when_finished "per_test_cleanup" &&
1321
+
1322
+ # Tell cache server to send 503 and origin server to send 200.
1323
+ start_gvfs_protocol_server_with_mayhem cache_http_503 &&
1324
+
1325
+ # Implicitly demand-load everything without any pre-seeding.
1326
+ # This should fail because we do not allow fallback.
1327
+ #
1328
+ test_must_fail \
1329
+ git -C "$REPO_T2" \
1330
+ -c core.useGVFSHelper=true \
1331
+ -c gvfs.fallback=false \
1332
+ diff $(cat m1.branch)..$(cat m3.branch) \
1333
+ >OUT.output 2>OUT.stderr &&
1334
+
1335
+ stop_gvfs_protocol_server
1336
+ '
1337
+
1338
+ test_expect_success ' integration: implicit-get: cache_http_503,with-fallback: diff 2 commits' '
1339
+ test_when_finished "per_test_cleanup" &&
1340
+
1341
+ # Tell cache server to send 503 and origin server to send 200.
1342
+ start_gvfs_protocol_server_with_mayhem cache_http_503 &&
1343
+
1344
+ # Implicitly demand-load everything without any pre-seeding.
1345
+ #
1346
+ git -C "$REPO_T2" \
1347
+ -c core.useGVFSHelper=true \
1348
+ -c gvfs.fallback=true \
1349
+ diff $(cat m1.branch)..$(cat m3.branch) \
1350
+ >OUT.output 2>OUT.stderr &&
1351
+
1352
+ stop_gvfs_protocol_server
1353
+ '
1354
+
1355
+ # T2 should be considered contaminated at this point.
1356
+
1357
+
1196
1358
# ################################################################
1197
1359
# Duplicate packfile tests.
1198
1360
#
0 commit comments