1package vnext23import (4 "bytes"5 "os"6 "path/filepath"7 "strings"8 "sync"9 "testing"10)1112func TestInstallStagesValidatedVNextBundleAndScanRejectsLegacy(t *testing.T) {13 t.Parallel()1415 packed, err := Compile(minimalVolume())16 if err != nil {17 t.Fatalf("compile: %v", err)18 }19 packed.Release.CreatedAt = "2026-08-01T20:13:08Z"20 var data bytes.Buffer21 if err := Write(&data, packed); err != nil {22 t.Fatalf("write: %v", err)23 }2425 source := filepath.Join(t.TempDir(), "download.atlas")26 if err := os.WriteFile(source, data.Bytes(), 0o644); err != nil {27 t.Fatalf("source: %v", err)28 }29 library := t.TempDir()30 installed, err := Install(library, source, StandardSchema())31 if err != nil {32 t.Fatalf("install: %v", err)33 }34 if filepath.Base(installed.Locator) != VersionedFileName("minimal", installed.release()) {35 t.Fatalf("installed as %s", installed.Locator)36 }3738 legacy := filepath.Join(library, "legacy.atlas")39 if err := os.WriteFile(legacy, []byte("not-vnext"), 0o644); err != nil {40 t.Fatalf("legacy: %v", err)41 }42 descriptors, skipped, err := Scan(library, StandardSchema())43 if err != nil {44 t.Fatalf("scan: %v", err)45 }46 if len(descriptors) != 1 || len(skipped) != 1 || !strings.Contains(skipped[0].Err.Error(), "open Atlas archive") {47 t.Fatalf("scan = %#v, skipped = %#v", descriptors, skipped)48 }49}5051func TestInstallRefusesCorruptionBeforeLibraryWrite(t *testing.T) {52 t.Parallel()5354 library := t.TempDir()55 source := filepath.Join(t.TempDir(), "broken.atlas")56 if err := os.WriteFile(source, []byte("broken"), 0o644); err != nil {57 t.Fatalf("source: %v", err)58 }59 if _, err := Install(library, source, StandardSchema()); err == nil {60 t.Fatal("broken source was installed")61 }62 entries, err := os.ReadDir(library)63 if err != nil {64 t.Fatalf("read library: %v", err)65 }66 if len(entries) != 0 {67 t.Fatalf("broken install left %d files", len(entries))68 }69}7071func TestInstallRefusesAnInvalidOrDifferentExistingStampTarget(t *testing.T) {72 t.Parallel()7374 source, data := nativeInstallFixture(t)75 for _, test := range []struct {76 name string77 mutate func(string) error78 }{79 {name: "corrupt", mutate: func(path string) error {80 contents, err := os.ReadFile(path)81 if err != nil {82 return err83 }84 contents[len(contents)/2] ^= 0xff85 return os.WriteFile(path, contents, 0o644)86 }},87 {name: "different bytes", mutate: func(path string) error {88 file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY, 0)89 if err != nil {90 return err91 }92 _, writeErr := file.WriteString("different container bytes")93 closeErr := file.Close()94 if writeErr != nil {95 return writeErr96 }97 return closeErr98 }},99 } {100 t.Run(test.name, func(t *testing.T) {101 library := t.TempDir()102 installed, present, err := InstallWithStatus(library, source, StandardSchema())103 if err != nil || present {104 t.Fatalf("initial install = %+v, present=%v, %v", installed, present, err)105 }106 if err := test.mutate(installed.Locator); err != nil {107 t.Fatal(err)108 }109 if _, _, err := InstallWithStatus(library, source, StandardSchema()); err == nil {110 t.Fatal("changed stamp target was accepted")111 }112 if got, err := os.ReadFile(source); err != nil || !bytes.Equal(got, data) {113 t.Fatal("validated source changed while refusing the target")114 }115 })116 }117}118119func TestConcurrentInstallsCreateOneImmutableTarget(t *testing.T) {120 t.Parallel()121122 source, _ := nativeInstallFixture(t)123 library := t.TempDir()124 const workers = 16125 results := make(chan Descriptor, workers)126 errors := make(chan error, workers)127 var group sync.WaitGroup128 for range workers {129 group.Add(1)130 go func() {131 defer group.Done()132 descriptor, err := Install(library, source, StandardSchema())133 if err != nil {134 errors <- err135 return136 }137 results <- descriptor138 }()139 }140 group.Wait()141 close(errors)142 close(results)143 for err := range errors {144 t.Errorf("concurrent install: %v", err)145 }146 var locator string147 for result := range results {148 if locator == "" {149 locator = result.Locator150 }151 if result.Locator != locator {152 t.Errorf("concurrent target = %s, want %s", result.Locator, locator)153 }154 }155 entries, err := os.ReadDir(library)156 if err != nil {157 t.Fatal(err)158 }159 if len(entries) != 1 || filepath.Ext(entries[0].Name()) != Extension {160 t.Fatalf("library entries = %v, want one committed Atlas", entries)161 }162}163164func nativeInstallFixture(t *testing.T) (string, []byte) {165 t.Helper()166 packed, err := Compile(minimalVolume())167 if err != nil {168 t.Fatal(err)169 }170 packed.Release.CreatedAt = "2026-08-08T12:00:00Z"171 var data bytes.Buffer172 if err := Write(&data, packed); err != nil {173 t.Fatal(err)174 }175 source := filepath.Join(t.TempDir(), "sample-region.atlas")176 if err := os.WriteFile(source, data.Bytes(), 0o644); err != nil {177 t.Fatal(err)178 }179 return source, data.Bytes()180}