github.com/google/fleetspeak@v0.1.15-0.20240426164851-4f31f62c1aea/fleetspeak/src/server/servertests/system_service_test.go (about)

     1  // Copyright 2017 Google Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     https://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // Package servertests contains tests of the fleetspeak server.
    16  package servertests_test
    17  
    18  import (
    19  	"context"
    20  	"testing"
    21  	"time"
    22  
    23  	"github.com/google/fleetspeak/fleetspeak/src/common"
    24  	"github.com/google/fleetspeak/fleetspeak/src/common/anypbtest"
    25  	fspb "github.com/google/fleetspeak/fleetspeak/src/common/proto/fleetspeak"
    26  	"github.com/google/fleetspeak/fleetspeak/src/server/db"
    27  	"github.com/google/fleetspeak/fleetspeak/src/server/sertesting"
    28  	"github.com/google/fleetspeak/fleetspeak/src/server/testserver"
    29  )
    30  
    31  func TestSystemServiceClientInfo(t *testing.T) {
    32  	ctx := context.Background()
    33  
    34  	ts := testserver.Make(t, "server", "SystemServiceClientInfo", nil)
    35  	defer ts.S.Stop()
    36  
    37  	k, err := ts.AddClient()
    38  	if err != nil {
    39  		t.Error(err)
    40  		return
    41  	}
    42  	id, err := common.MakeClientID(k)
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  
    47  	m := fspb.Message{
    48  		Source: &fspb.Address{
    49  			ClientId:    id.Bytes(),
    50  			ServiceName: "system",
    51  		},
    52  		Destination: &fspb.Address{
    53  			ServiceName: "system",
    54  		},
    55  		SourceMessageId: []byte("1"),
    56  		MessageType:     "ClientInfo",
    57  		Data: anypbtest.New(t, &fspb.ClientInfoData{
    58  			Labels: []*fspb.Label{
    59  				{ServiceName: "client", Label: "linux"},
    60  				{ServiceName: "client", Label: "corp"},
    61  			},
    62  			Services: []*fspb.ClientInfoData_ServiceID{
    63  				{Name: "TestService", Signature: []byte("signature")},
    64  			},
    65  		}),
    66  	}
    67  	m.MessageId = common.MakeMessageID(m.Source, m.SourceMessageId).Bytes()
    68  
    69  	if err := ts.ProcessMessageFromClient(k, &m); err != nil {
    70  		t.Fatal(err)
    71  	}
    72  
    73  	cd, err := ts.DS.GetClientData(ctx, id)
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  	if len(cd.Labels) != 2 {
    78  		t.Errorf("Expected 2 labels, got: %v", cd.Labels)
    79  	}
    80  
    81  	m.SourceMessageId = []byte("2")
    82  	m.MessageId = common.MakeMessageID(m.Source, m.SourceMessageId).Bytes()
    83  	m.Data = anypbtest.New(t, &fspb.ClientInfoData{
    84  		Labels: []*fspb.Label{
    85  			{ServiceName: "client", Label: "linux"},
    86  		},
    87  		Services: []*fspb.ClientInfoData_ServiceID{
    88  			{Name: "TestService", Signature: []byte("signature")},
    89  		},
    90  	})
    91  	if err := ts.ProcessMessageFromClient(k, &m); err != nil {
    92  		t.Fatal(err)
    93  	}
    94  	cd, err = ts.DS.GetClientData(ctx, id)
    95  	if err != nil {
    96  		t.Fatal(err)
    97  	}
    98  	if len(cd.Labels) != 1 {
    99  		t.Errorf("Expected 1 label, got: %v", cd.Labels)
   100  	}
   101  }
   102  
   103  func TestSystemServiceMessageAck(t *testing.T) {
   104  	ctx := context.Background()
   105  
   106  	fin1 := sertesting.SetClientRetryTime(func() time.Time { return db.Now().Add(time.Minute) })
   107  	defer fin1()
   108  	fin2 := sertesting.SetServerRetryTime(func(_ uint32) time.Time { return db.Now().Add(time.Minute) })
   109  	defer fin2()
   110  
   111  	ts := testserver.Make(t, "server", "SystemServiceMessageAck", nil)
   112  
   113  	k, err := ts.AddClient()
   114  	if err != nil {
   115  		t.Error(err)
   116  		return
   117  	}
   118  	cid, err := common.MakeClientID(k)
   119  	if err != nil {
   120  		t.Fatal(err)
   121  	}
   122  
   123  	mid, err := common.StringToMessageID("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f")
   124  	if err != nil {
   125  		t.Fatal(err)
   126  	}
   127  
   128  	if err := ts.DS.StoreMessages(ctx, []*fspb.Message{
   129  		{
   130  			MessageId: mid.Bytes(),
   131  			Source: &fspb.Address{
   132  				ServiceName: "TestService"},
   133  			Destination: &fspb.Address{
   134  				ClientId:    cid.Bytes(),
   135  				ServiceName: "TestService"},
   136  			CreationTime: db.NowProto(),
   137  		}}, ""); err != nil {
   138  		t.Fatal(err)
   139  	}
   140  
   141  	msg := ts.GetMessage(ctx, mid)
   142  	if msg.Result != nil {
   143  		t.Fatal("Added message should not be processed.")
   144  	}
   145  
   146  	m := fspb.Message{
   147  		Source: &fspb.Address{
   148  			ClientId:    cid.Bytes(),
   149  			ServiceName: "system",
   150  		},
   151  		Destination: &fspb.Address{
   152  			ServiceName: "system",
   153  		},
   154  		SourceMessageId: []byte("1"),
   155  		MessageType:     "MessageAck",
   156  	}
   157  	m.MessageId = common.MakeMessageID(m.Source, m.SourceMessageId).Bytes()
   158  	m.Data = anypbtest.New(t, &fspb.MessageAckData{
   159  		MessageIds: [][]byte{mid.Bytes()},
   160  	})
   161  	if err := ts.ProcessMessageFromClient(k, &m); err != nil {
   162  		t.Fatal(err)
   163  	}
   164  
   165  	msg = ts.GetMessage(ctx, mid)
   166  	if msg.Result == nil {
   167  		t.Fatal("Added message should now be processed.")
   168  	}
   169  }
   170  
   171  func TestSystemServiceMessageError(t *testing.T) {
   172  	ctx := context.Background()
   173  
   174  	fin1 := sertesting.SetClientRetryTime(func() time.Time { return db.Now().Add(time.Minute) })
   175  	defer fin1()
   176  	fin2 := sertesting.SetServerRetryTime(func(_ uint32) time.Time { return db.Now().Add(time.Minute) })
   177  	defer fin2()
   178  
   179  	ts := testserver.Make(t, "server", "SystemServiceMessageError", nil)
   180  	defer ts.S.Stop()
   181  
   182  	k, err := ts.AddClient()
   183  	if err != nil {
   184  		t.Error(err)
   185  		return
   186  	}
   187  	cid, err := common.MakeClientID(k)
   188  	if err != nil {
   189  		t.Fatal(err)
   190  	}
   191  
   192  	mid, err := common.StringToMessageID("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f")
   193  	if err != nil {
   194  		t.Fatal(err)
   195  	}
   196  
   197  	if err := ts.DS.StoreMessages(ctx, []*fspb.Message{
   198  		{
   199  			MessageId: mid.Bytes(),
   200  			Source: &fspb.Address{
   201  				ServiceName: "TestService"},
   202  			Destination: &fspb.Address{
   203  				ClientId:    cid.Bytes(),
   204  				ServiceName: "TestService"},
   205  			CreationTime: db.NowProto(),
   206  		}}, ""); err != nil {
   207  		t.Fatal(err)
   208  	}
   209  
   210  	msg := ts.GetMessage(ctx, mid)
   211  	if msg.Result != nil {
   212  		t.Fatal("Added message should not be processed.")
   213  	}
   214  
   215  	m := fspb.Message{
   216  		Source: &fspb.Address{
   217  			ClientId:    cid.Bytes(),
   218  			ServiceName: "system",
   219  		},
   220  		Destination: &fspb.Address{
   221  			ServiceName: "system",
   222  		},
   223  		SourceMessageId: []byte("1"),
   224  		MessageType:     "MessageError",
   225  	}
   226  	m.MessageId = common.MakeMessageID(m.Source, m.SourceMessageId).Bytes()
   227  	m.Data = anypbtest.New(t, &fspb.MessageErrorData{
   228  		MessageId: mid.Bytes(),
   229  		Error:     "failed badly",
   230  	})
   231  	if err := ts.ProcessMessageFromClient(k, &m); err != nil {
   232  		t.Fatal(err)
   233  	}
   234  
   235  	msg = ts.GetMessage(ctx, mid)
   236  	if msg.Result == nil {
   237  		t.Fatal("Added message should now be failed.")
   238  	}
   239  }