func TestVolumeEntryExpandMaxBrickLimit(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() // Create a large cluster err := setupSampleDbWithTopology(app, 10, // clusters 4, // nodes_per_cluster 24, // devices_per_node, 600*GB, // disksize) ) tests.Assert(t, err == nil) // Create large volume v := createSampleVolumeEntry(100) err = v.Create(app.db, app.executor, app.allocator) tests.Assert(t, err == nil) // Add a bunch of bricks until the limit fakebricks := make(sort.StringSlice, BRICK_MAX_NUM-len(v.Bricks)) v.Bricks = append(v.Bricks, fakebricks...) // Try to expand the volume, but it will return that the max number // of bricks has been reached err = v.Expand(app.db, app.executor, app.allocator, 100) tests.Assert(t, err == ErrMaxBricks, err) }
func TestNoneDurabilityDefaults(t *testing.T) { r := &NoneDurability{} tests.Assert(t, r.Replica == 0) r.SetDurability() tests.Assert(t, r.Replica == 1) }
func TestVolumeCreateSmallSize(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() router := mux.NewRouter() app.SetRoutes(router) // Setup the server ts := httptest.NewServer(router) defer ts.Close() // VolumeCreate JSON Request request := []byte(`{ "size" : 0 }`) // Send request r, err := http.Post(ts.URL+"/volumes", "application/json", bytes.NewBuffer(request)) tests.Assert(t, err == nil) tests.Assert(t, r.StatusCode == http.StatusBadRequest) body, err := ioutil.ReadAll(io.LimitReader(r.Body, r.ContentLength)) tests.Assert(t, err == nil) r.Body.Close() tests.Assert(t, strings.Contains(string(body), "Invalid volume size")) }
func TestGlusterFSDBFileLoad(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) db := NewGlusterFSDB(tmpfile) db.nodes["one"] = &NodeEntry{ Info: requests.NodeInfoResp{ Name: "nodetest", }, } db.volumes["a"] = &VolumeEntry{ Info: requests.VolumeInfoResp{ Name: "volumetest", }, } err := db.Commit() tests.Assert(t, err == nil) newdb := NewGlusterFSDB(tmpfile) tests.Assert(t, newdb != nil) tests.Assert(t, newdb.nodes["one"].Info.Name == db.nodes["one"].Info.Name) tests.Assert(t, newdb.volumes["a"].Info.Name == db.volumes["a"].Info.Name) }
func TestVolumeListEmpty(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() router := mux.NewRouter() app.SetRoutes(router) // Setup the server ts := httptest.NewServer(router) defer ts.Close() // Get volumes, there should be none r, err := http.Get(ts.URL + "/volumes") tests.Assert(t, r.StatusCode == http.StatusOK) tests.Assert(t, err == nil) tests.Assert(t, r.Header.Get("Content-Type") == "application/json; charset=UTF-8") // Read response var msg VolumeListResponse err = utils.GetJsonFromResponse(r, &msg) tests.Assert(t, err == nil) tests.Assert(t, len(msg.Volumes) == 0) }
func TestNewStatusGroup(t *testing.T) { s := NewStatusGroup() tests.Assert(t, s != nil) tests.Assert(t, s.results != nil) tests.Assert(t, len(s.results) == 0) tests.Assert(t, s.err == nil) }
func TestNewDeviceEntryMarshal(t *testing.T) { req := &Device{ Name: "dev", Weight: 123, } nodeid := "abc" d := NewDeviceEntryFromRequest(req, nodeid) d.Info.Storage.Free = 10 d.Info.Storage.Total = 100 d.Info.Storage.Used = 1000 d.BrickAdd("abc") d.BrickAdd("def") buffer, err := d.Marshal() tests.Assert(t, err == nil) tests.Assert(t, buffer != nil) tests.Assert(t, len(buffer) > 0) um := &DeviceEntry{} err = um.Unmarshal(buffer) tests.Assert(t, err == nil) tests.Assert(t, reflect.DeepEqual(um, d)) }
func TestNewSimpleAllocator(t *testing.T) { a := NewSimpleAllocator() tests.Assert(t, a != nil) tests.Assert(t, a.rings != nil) }
func TestReplicaDurabilityDefaults(t *testing.T) { r := &ReplicaDurability{} tests.Assert(t, r.Replica == 0) r.SetDurability() tests.Assert(t, r.Replica == DEFAULT_REPLICA) }
func TestNewBrickEntryFromId(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() // Create a brick b := NewBrickEntry(10, 20, 5, "abc", "def") // Save element in database err := app.db.Update(func(tx *bolt.Tx) error { return b.Save(tx) }) tests.Assert(t, err == nil) var brick *BrickEntry err = app.db.View(func(tx *bolt.Tx) error { var err error brick, err = NewBrickEntryFromId(tx, b.Info.Id) return err }) tests.Assert(t, err == nil) tests.Assert(t, reflect.DeepEqual(brick, b)) }
func TestVolumeEntryFromId(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() // Create a volume entry v := createSampleVolumeEntry(1024) // Save in database err := app.db.Update(func(tx *bolt.Tx) error { return v.Save(tx) }) tests.Assert(t, err == nil) // Load from database var entry *VolumeEntry err = app.db.View(func(tx *bolt.Tx) error { var err error entry, err = NewVolumeEntryFromId(tx, v.Info.Id) return err }) tests.Assert(t, err == nil) tests.Assert(t, reflect.DeepEqual(entry, v)) }
func TestVolumeExpandIdNotFound(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() router := mux.NewRouter() app.SetRoutes(router) // Setup the server ts := httptest.NewServer(router) defer ts.Close() // JSON Request request := []byte(`{ "expand_size" : 100 }`) // Now that we have some data in the database, we can // make a request for the clutser list r, err := http.Post(ts.URL+"/volumes/12345/expand", "application/json", bytes.NewBuffer(request)) tests.Assert(t, err == nil) tests.Assert(t, r.StatusCode == http.StatusNotFound, r.StatusCode) body, err := ioutil.ReadAll(io.LimitReader(r.Body, r.ContentLength)) tests.Assert(t, err == nil) r.Body.Close() tests.Assert(t, strings.Contains(string(body), "Id not found")) }
func TestDisperseDurability(t *testing.T) { r := &DisperseDurability{ Data: 8, Redundancy: 3, } gen := r.BrickSizeGenerator(200 * GB) // Gen 1 sets, brick_size, err := gen() tests.Assert(t, err == nil) tests.Assert(t, sets == 2) tests.Assert(t, brick_size == uint64(100*GB/8)) tests.Assert(t, 8+3 == r.BricksInSet()) // Gen 2 sets, brick_size, err = gen() tests.Assert(t, err == nil) tests.Assert(t, sets == 4) tests.Assert(t, brick_size == uint64(50*GB/8)) tests.Assert(t, 8+3 == r.BricksInSet()) // Gen 3 sets, brick_size, err = gen() tests.Assert(t, err == ErrMininumBrickSize) tests.Assert(t, 8+3 == r.BricksInSet()) }
func TestNodeAddHandler(t *testing.T) { var msg requests.NodeInfoResp // Instead of coding our own JSON here, // create the JSON message as a string to test the handler request := []byte(`{ "name" : "test_name", "zone" : 12345 }`) n := NewNodeServer(mock.NewMockPlugin()) ts := httptest.NewServer(http.HandlerFunc(n.NodeAddHandler)) defer ts.Close() // Request r, err := http.Post(ts.URL, "application/json", bytes.NewBuffer(request)) tests.Assert(t, r.StatusCode == http.StatusCreated) tests.Assert(t, err == nil) // Check body err = utils.GetJsonFromResponse(r, &msg) tests.Assert(t, err == nil) tests.Assert(t, msg.Name == "test_name") tests.Assert(t, msg.Zone == 12345) }
func TestNewNodeEntryMarshal(t *testing.T) { req := &NodeAddRequest{ ClusterId: "123", Hostnames: HostAddresses{ Manage: []string{"manage"}, Storage: []string{"storage"}, }, Zone: 99, } n := NewNodeEntryFromRequest(req) n.DeviceAdd("abc") n.DeviceAdd("def") buffer, err := n.Marshal() tests.Assert(t, err == nil) tests.Assert(t, buffer != nil) tests.Assert(t, len(buffer) > 0) um := &NodeEntry{} err = um.Unmarshal(buffer) tests.Assert(t, err == nil) tests.Assert(t, reflect.DeepEqual(n, um)) }
func TestNewBrickEntryNewInfoResponse(t *testing.T) { tmpfile := tests.Tempfile() defer os.Remove(tmpfile) // Create the app app := NewTestApp(tmpfile) defer app.Close() // Create a brick b := NewBrickEntry(10, 20, 5, "abc", "def") // Save element in database err := app.db.Update(func(tx *bolt.Tx) error { return b.Save(tx) }) tests.Assert(t, err == nil) var info *BrickInfo err = app.db.View(func(tx *bolt.Tx) error { brick, err := NewBrickEntryFromId(tx, b.Id()) if err != nil { return err } info, err = brick.NewInfoResponse(tx) return err }) tests.Assert(t, err == nil) tests.Assert(t, reflect.DeepEqual(*info, b.Info)) }
func TestNewNodeEntry(t *testing.T) { n := NewNodeEntry() tests.Assert(t, n.Info.Id == "") tests.Assert(t, n.Info.ClusterId == "") tests.Assert(t, len(n.Devices) == 0) tests.Assert(t, n.Devices != nil) }
func TestNewManager(t *testing.T) { manager := NewAsyncHttpManager("/x") tests.Assert(t, len(manager.handlers) == 0) tests.Assert(t, manager.route == "/x") }
func TestNewVolumeEntry(t *testing.T) { v := NewVolumeEntry() tests.Assert(t, v.Bricks != nil) tests.Assert(t, len(v.Info.Id) == 0) tests.Assert(t, len(v.Info.Cluster) == 0) tests.Assert(t, len(v.Info.Clusters) == 0) }
func TestNewClusterEntry(t *testing.T) { c := NewClusterEntry() tests.Assert(t, c.Info.Id == "") tests.Assert(t, c.Info.Volumes != nil) tests.Assert(t, c.Info.Nodes != nil) tests.Assert(t, len(c.Info.Volumes) == 0) tests.Assert(t, len(c.Info.Nodes) == 0) }
func TestNoneDurabilitySetExecutorRequest(t *testing.T) { r := &NoneDurability{} r.SetDurability() v := &executors.VolumeRequest{} r.SetExecutorVolumeRequest(v) tests.Assert(t, v.Replica == 1) tests.Assert(t, v.Type == executors.DurabilityNone) }
func TestReplicaDurabilitySetExecutorRequest(t *testing.T) { r := &ReplicaDurability{} r.SetDurability() v := &executors.VolumeRequest{} r.SetExecutorVolumeRequest(v) tests.Assert(t, v.Replica == r.Replica) tests.Assert(t, v.Type == executors.DurabilityReplica) }
func TestDisperseDurabilityDefaults(t *testing.T) { r := &DisperseDurability{} tests.Assert(t, r.Data == 0) tests.Assert(t, r.Redundancy == 0) r.SetDurability() tests.Assert(t, r.Data == DEFAULT_EC_DATA) tests.Assert(t, r.Redundancy == DEFAULT_EC_REDUNDANCY) }
func TestNewJwtAuth(t *testing.T) { c := &JwtAuthConfig{} c.Admin.PrivateKey = "Key" c.User.PrivateKey = "UserKey" j := NewJwtAuth(c) tests.Assert(t, string(j.adminKey) == c.Admin.PrivateKey) tests.Assert(t, string(j.userKey) == c.User.PrivateKey) tests.Assert(t, j != nil) }
func TestDisperseDurabilitySetExecutorRequest(t *testing.T) { r := &DisperseDurability{} r.SetDurability() v := &executors.VolumeRequest{} r.SetExecutorVolumeRequest(v) tests.Assert(t, v.Data == r.Data) tests.Assert(t, v.Redundancy == r.Redundancy) tests.Assert(t, v.Type == executors.DurabilityDispersion) }
func TestNewHandler(t *testing.T) { manager := NewAsyncHttpManager("/x") handler := manager.NewHandler() tests.Assert(t, handler.location == "") tests.Assert(t, handler.id != "") tests.Assert(t, handler.completed == false) tests.Assert(t, handler.err == nil) tests.Assert(t, manager.handlers[handler.id] == handler) }
func TestReplicaDurabilityLargeBrickGenerator(t *testing.T) { r := &ReplicaDurability{ Replica: 2, } gen := r.BrickSizeGenerator(100 * TB) // Gen 1 sets, brick_size, err := gen() tests.Assert(t, err == nil) tests.Assert(t, sets == 32) tests.Assert(t, brick_size == 3200*GB) tests.Assert(t, 2 == r.BricksInSet()) }
func TestJwt(t *testing.T) { // Setup jwt c := &JwtAuthConfig{} c.Admin.PrivateKey = "Key" c.User.PrivateKey = "UserKey" j := NewJwtAuth(c) tests.Assert(t, j != nil) // Setup middleware framework n := negroni.New(j) tests.Assert(t, n != nil) // Create a simple middleware to check if it was called called := false mw := func(rw http.ResponseWriter, r *http.Request) { data := context.Get(r, "jwt") tests.Assert(t, data != nil) token := data.(*jwt.Token) tests.Assert(t, token.Claims["iss"] == "admin") called = true rw.WriteHeader(http.StatusOK) } n.UseHandlerFunc(mw) // Create test server ts := httptest.NewServer(n) // Create token with missing 'iss' claim token := jwt.New(jwt.SigningMethodHS256) token.Claims["iss"] = "admin" token.Claims["iat"] = time.Now().Unix() token.Claims["exp"] = time.Now().Add(time.Second * 10).Unix() // Generate qsh qshstring := "GET&/" hash := sha256.New() hash.Write([]byte(qshstring)) token.Claims["qsh"] = hex.EncodeToString(hash.Sum(nil)) tokenString, err := token.SignedString([]byte("Key")) tests.Assert(t, err == nil) // Setup header req, err := http.NewRequest("GET", ts.URL, nil) tests.Assert(t, err == nil) // Miss 'bearer' string req.Header.Set("Authorization", "bearer "+tokenString) r, err := http.DefaultClient.Do(req) tests.Assert(t, err == nil) tests.Assert(t, r.StatusCode == http.StatusOK) tests.Assert(t, called == true) }
func TestLogLevel(t *testing.T) { var testbuffer bytes.Buffer defer tests.Patch(&stdout, &testbuffer).Restore() l := NewLogger("[testing]", LEVEL_INFO) tests.Assert(t, LEVEL_INFO == l.level) tests.Assert(t, LEVEL_INFO == l.Level()) l.SetLevel(LEVEL_CRITICAL) tests.Assert(t, LEVEL_CRITICAL == l.level) tests.Assert(t, LEVEL_CRITICAL == l.Level()) }
func TestDisperseDurabilityLargeBrickGenerator(t *testing.T) { r := &DisperseDurability{ Data: 8, Redundancy: 3, } gen := r.BrickSizeGenerator(800 * TB) // Gen 1 sets, brick_size, err := gen() tests.Assert(t, err == nil) tests.Assert(t, sets == 32) tests.Assert(t, brick_size == 3200*GB) tests.Assert(t, 8+3 == r.BricksInSet()) }