func TestSetCPU(t *testing.T) { currentCPU := runtime.GOMAXPROCS(-1) maxCPU := runtime.NumCPU() for i, test := range []struct { input string output int shouldErr bool }{ {"1", 1, false}, {"-1", currentCPU, true}, {"0", currentCPU, true}, {"100%", maxCPU, false}, {"50%", int(0.5 * float32(maxCPU)), false}, {"110%", currentCPU, true}, {"-10%", currentCPU, true}, {"invalid input", currentCPU, true}, {"invalid input%", currentCPU, true}, {"9999", maxCPU, false}, // over available CPU } { err := app.SetCPU(test.input) if test.shouldErr && err == nil { t.Errorf("Test %d: Expected error, but there wasn't any", i) } if !test.shouldErr && err != nil { t.Errorf("Test %d: Expected no error, but there was one: %v", i, err) } if actual, expected := runtime.GOMAXPROCS(-1), test.output; actual != expected { t.Errorf("Test %d: GOMAXPROCS was %d but expected %d", i, actual, expected) } // teardown runtime.GOMAXPROCS(currentCPU) } }
func main() { flag.Parse() if version { fmt.Printf("%s %s\n", app.Name, app.Version) os.Exit(0) } // Set CPU cap err := app.SetCPU(cpu) if err != nil { log.Fatal(err) } // Load config from file addresses, err := loadConfigs() if err != nil { log.Fatal(err) } // Start each server with its one or more configurations for addr, configs := range addresses { s, err := server.New(addr.String(), configs) if err != nil { log.Fatal(err) } s.HTTP2 = app.HTTP2 // TODO: This setting is temporary app.Wg.Add(1) go func(s *server.Server) { defer app.Wg.Done() err := s.Serve() if err != nil { log.Fatal(err) // kill whole process to avoid a half-alive zombie server } }(s) app.Servers = append(app.Servers, s) } // Show initialization output if !app.Quiet { var checkedFdLimit bool for addr, configs := range addresses { for _, conf := range configs { // Print address of site fmt.Println(conf.Address()) // Note if non-localhost site resolves to loopback interface if addr.IP.IsLoopback() && !isLocalhost(conf.Host) { fmt.Printf("Notice: %s is only accessible on this machine (%s)\n", conf.Host, addr.IP.String()) } if !checkedFdLimit && !addr.IP.IsLoopback() && !isLocalhost(conf.Host) { checkFdlimit() checkedFdLimit = true } } } } // Wait for all listeners to stop app.Wg.Wait() }