@@ -1194,6 +1194,77 @@ func TestCmdFileCreateExclusiveRoundTrip(t *testing.T) {
11941194 }
11951195}
11961196
1197+ func TestCmdFileCreateExclusiveUsesConfigScopedState (t * testing.T ) {
1198+ t .Helper ()
1199+
1200+ env := newSyncTestEnv (t )
1201+ env .startDaemon (t )
1202+ defer env .stopDaemon ()
1203+
1204+ oldCfgPathOverride := cfgPathOverride
1205+ cfgPathOverride = filepath .Join (t .TempDir (), "afs.config.json" )
1206+ t .Cleanup (func () {
1207+ cfgPathOverride = oldCfgPathOverride
1208+ })
1209+
1210+ cfg := defaultConfig ()
1211+ cfg .ProductMode = productModeLocal
1212+ cfg .Mode = modeSync
1213+ cfg .RedisAddr = env .mr .Addr ()
1214+ cfg .RedisDB = 0
1215+ cfg .LocalPath = env .localRoot
1216+ cfg .CurrentWorkspace = env .workspace
1217+ if err := saveConfig (cfg ); err != nil {
1218+ t .Fatalf ("saveConfig() returned error: %v" , err )
1219+ }
1220+
1221+ st := state {
1222+ ProductMode : productModeLocal ,
1223+ RedisAddr : env .mr .Addr (),
1224+ RedisDB : 0 ,
1225+ CurrentWorkspace : env .workspace ,
1226+ LocalPath : env .localRoot ,
1227+ Mode : modeSync ,
1228+ SyncPID : os .Getpid (),
1229+ }
1230+ if err := saveState (st ); err != nil {
1231+ t .Fatalf ("saveState() returned error: %v" , err )
1232+ }
1233+ if sameConfigPath (statePath (), defaultStatePath ()) {
1234+ t .Fatalf ("statePath() = %q, want config-scoped path distinct from legacy %q" , statePath (), defaultStatePath ())
1235+ }
1236+
1237+ legacyState := state {
1238+ ProductMode : productModeLocal ,
1239+ RedisAddr : "127.0.0.1:1" ,
1240+ RedisDB : 99 ,
1241+ CurrentWorkspace : "legacy-workspace" ,
1242+ LocalPath : t .TempDir (),
1243+ Mode : modeSync ,
1244+ SyncPID : os .Getpid (),
1245+ }
1246+ rawLegacyState , err := json .MarshalIndent (legacyState , "" , " " )
1247+ if err != nil {
1248+ t .Fatalf ("json.MarshalIndent(legacyState) returned error: %v" , err )
1249+ }
1250+ if err := os .MkdirAll (filepath .Dir (defaultStatePath ()), 0o700 ); err != nil {
1251+ t .Fatalf ("MkdirAll(defaultStatePath dir) returned error: %v" , err )
1252+ }
1253+ if err := os .WriteFile (defaultStatePath (), rawLegacyState , 0o600 ); err != nil {
1254+ t .Fatalf ("WriteFile(defaultStatePath) returned error: %v" , err )
1255+ }
1256+
1257+ if err := cmdFS ([]string {"fs" , "create-exclusive" , "--content" , "agent-c\n " , "/tasks/003.claim" }); err != nil {
1258+ t .Fatalf ("cmdFS(create-exclusive with config-scoped state) returned error: %v" , err )
1259+ }
1260+ assertEventually (t , 3 * time .Second , "remote 003.claim" , func () bool {
1261+ return env .remoteExists (t , "tasks/003.claim" )
1262+ })
1263+ if got := env .readRemoteFile (t , "tasks/003.claim" ); got != "agent-c\n " {
1264+ t .Fatalf ("remote content = %q, want %q" , got , "agent-c\n " )
1265+ }
1266+ }
1267+
11971268// Scenario 1 (burst variant): a batch of files written before startup all
11981269// land remotely, and the steady-state has no spurious echo loops.
11991270func TestSyncStartupUploadBurst (t * testing.T ) {
0 commit comments