package host import ( "context" "encoding/json" "errors" "testing" "github.com/carlosframework/platform/internal/release" ) func TestParseMemAvailable(t *testing.T) { const meminfo = "MemTotal: 16000000 kB\nMemFree: 500000 kB\nMemAvailable: 2263040 kB\n" if got := parseMemAvailableMiB(meminfo); got != 2210 { t.Fatalf("got %d, want 2210", got) } if got := parseMemAvailableMiB("MemTotal: 1 kB\n"); got != 0 { t.Fatalf("no MemAvailable line: got %d, want 0", got) } if got := parseMemAvailableMiB("MemAvailable: lots kB\n"); got != 0 { t.Fatalf("unparseable: got %d, want 0", got) } } func TestHeadroomOnlyPublishedWithTheCapability(t *testing.T) { reg := edgesTestRegistry(t) if got := headroomFor(nil, t.TempDir(), reg); got != nil { t.Fatalf("flag off: headroom = %+v, want nil", got) } if got := headroomFor([]string{capRegionHA1}, t.TempDir(), reg); got == nil { t.Fatal("flag on: headroom is nil") } } // Region HA spec 2 ยง7: the totals ride beside the free figures, and a // failed reading is 0, never a guess. func TestCapacityMiBReadsTotalsAndZeroesFailures(t *testing.T) { gib := int64(8 << 30) mem := func() (*int64, *int64) { return &gib, nil } disk := func() (uint64, uint64, error) { return 100 << 30, 1 << 30, nil } if m, d := capacityMiB(mem, disk); m != 8192 || d != 102400 { t.Fatalf("capacity = %d, %d; want 8192, 102400", m, d) } noMem := func() (*int64, *int64) { return nil, nil } noDisk := func() (uint64, uint64, error) { return 0, 0, errors.New("statfs") } if m, d := capacityMiB(noMem, noDisk); m != 0 || d != 0 { t.Fatalf("failed readings = %d, %d; want 0, 0", m, d) } } func TestHeadroomCarriesTheDataVolumeSize(t *testing.T) { h := headroomFor([]string{capRegionHA1}, t.TempDir(), edgesTestRegistry(t)) if h == nil || h.DiskTotalMiB <= 0 { t.Fatalf("headroom %+v: want the data volume's size", h) } } func TestEdgesFileWireCarriesHeadroomTotals(t *testing.T) { s, reg := release.NewDirStore(t.TempDir()), edgesTestRegistry(t) var last []byte ident := edgesFile{Box: "annie", BoxID: "i-0abc", Capabilities: []string{"region-ha-1"}, Headroom: &edgeHeadroom{MemFreeMiB: 2210, DiskFreeMiB: 31200, Awake: 14, MemTotalMiB: 7900, DiskTotalMiB: 61000}} if err := edgesFilePass(context.Background(), s, reg, ident, "1.2.3.4", &last); err != nil { t.Fatal(err) } body, _, err := s.Get(context.Background(), "control/edges/annie.json") if err != nil { t.Fatal(err) } var raw map[string]json.RawMessage if err := json.Unmarshal(body, &raw); err != nil { t.Fatal(err) } if want := `{"mem_free_mib":2210,"disk_free_mib":31200,"awake":14,"mem_total_mib":7900,"disk_total_mib":61000}`; string(raw["headroom"]) != want { t.Fatalf("headroom = %s, want %s", raw["headroom"], want) } }