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 }