func TestNoSuchProcess(t *testing.T) {
	s := `<config>
                       <hostgroup id="foo">
                               <cluster id="foo.live">
                                       <host id="foo001">
                                               <process id="foo.process"/>
                                       </host>
                               </cluster>
                       </hostgroup>
                       <querygroup id="q" targets="foo">
                               <query id="x" on="X:name=*" attributes="K,L"/>
                       </querygroup>
               </config>`
	cfg, _ := config.Decode(strings.NewReader(s))
	h := &handler{
		config: cfg,
	}
	view, _ := h.View(&Key{
		Host:    "foo002",
		Process: "foo",
	})
	// Make sure we are not matching process names with any other
	// targets (in this case hostgroup foo)
	if len(view.Objects) > 0 {
		t.Errorf("unexpected result\ngot:  %+v\nwant: []", view.Objects[0])
	}
}
func TestUpdate(t *testing.T) {
	for i, tt := range testUpdate {
		out, err := config.Decode(strings.NewReader(tt.in))
		if err != nil {
			if tt.err == "" {
				t.Errorf("#%d. unexpected error: %v", i, err)
				continue
			}
			if !strings.Contains(err.Error(), tt.err) {
				t.Errorf("#%d. invalid error, got: %s, want: %s", i, err, tt.err)
				continue
			}
			continue
		}
		if tt.err != "" {
			t.Errorf("#%d. unexpected success, want error: %v", i, tt.err)
			continue
		}
		if err := Update(out); err != nil {
			t.Fatalf("Update failed after Decode")
		}
		// Omit uninteresting data.
		out.Filter = nil
		out.Network = nil
		out.Hosts.NS = nil
		for _, elem := range out.Extra {
			elem.Name = ""
			elem.Raw = nil
		}
		for _, host := range out.Hosts.All {
			for _, elem := range host.Extra {
				elem.Name = ""
				elem.Raw = nil
			}
		}
		if len(out.Hosts.All) == 0 {
			out.Hosts = nil
		}
		// Test what remained.
		if !reflect.DeepEqual(out, tt.out) {
			t.Errorf("#%d. invalid output\ngot:  %+v\nwant: %+v", i, out, tt.out)
		}
	}
}